日本語の不得手な方がまだいらっしゃるようで
953 :
デフォルトの名無しさん:2005/12/06(火) 18:38:45
先生、質問です。
これはいけないことですか?
CAtlArray<IHTMLDocument2*> pHTMLArray;
void hoge(IHTMLDocument2 *pDoc)
{
pHTMLArray.Add(pDoc);
}
ATL使ってるんならスマートポインタ使おうよ
COMのリファレンスカウントをちゃんと守りませう。
956 :
953:2005/12/06(火) 21:22:53
>954-955
CAtlArray<CComPtr<IHTMLDocument2>>でエラーがでてよくわからんかったわけですが、
CAtlArray<CComPtr<IHTMLDocument2> > arr;
Addref, Release
上のどっちかというが判明しました、ありがとうございます。
先生、さよーなら。
957 :
デフォルトの名無しさん:2005/12/07(水) 15:38:29
IEコンポーネントのウィンドウにフォーカスを移すのってどうやるんでしょうか?
SetFocusをしてもキーボードフォーカスが移動しないので・・
7.5 Final EXE !
windows.hみたいなので定義されてる構造体を
COMオブジェクトのプロパティに使いたいのだけれど、
こういうの1つ1つIDLで再定義していくんですか?
具体的にはWAVEFORMATEXをプロパティとするオブジェクトを作りたいのですが。
variant
>>961 それだとVARIANT型のプロパティになるんですよね?
よくDirectXなんかでDSBUFFERDESCみたいな構造体を
直接受け付ける関数あるじゃないですか。
ああいうのはどうなってるんでしょうか
ポインタ
すんません、できました。
IDLに#include "windows.h"とやるとコンパイルできなくて、
typedef struct tagWAVEFORMAT { .. } WAVEFORMAT;
とするとIDLのコンパイルは通るのですが
生成されるmyclass.hを使うときにWAVEFORMATの二重定義になって困っていました。
そこでIDLで宣言するときに
cpp_quote("#ifdef WAVEFORMAT")
typedef ...
cpp_quote("#endif")
として、生成されたmyclass.hで無効にしてやると上手くいきました。
オイオイ
なるほどそういう流れか
どういう意味?
setup71.jsで登録したWTL App Wizardをアンインスコするにはjsを読んで手動で
レジストリを消すとかしないと駄目ですか?
>>969 そうかも
俺も2つとか残っててマンドクセーと思ったことが
レジストリは変更してないよ?
ファイルをコピーしているだけ
フォルダの中身参照してるだけな。
973 :
969:2005/12/11(日) 00:06:11
>>970-972 C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\vcprojectsから
WTL*.vsz, WTL*.vsdir, WTL*.ico を消すだけですね。。
WTLはスレッドサポートしてる?
CMutexとかみあたらないんだけど...
無いよ。
Win32APIでがんばりましょう。
普通に_beginthreadex使えるよ。CRT使わないならCreateThread(Ex)ね。
あとはCriticalSectionなりMutexなり。
俺は親スレッドにデータ渡すときは
parent.SendMessage(WM_USER_SENDDATA, (WPARAM)data, (LPARAM)dataSize);
で配列渡してるけどね。メッセージキューの利用はスレッドセーフなのです。
っていうかむしろそれ以外の方法使うの危険。
ATL Serverにはそのものズバリなスレッドクラスがあったけど
使った経験ない。
それ以外の方法?
APCとか、IOCPとかは危険?
いや、ごめん。基本的にAPIベースで使える手段は一通り使えるはず。
メッセージキューってのはリストビューとかのウィンドウにデータを渡すときの話ね。
無理矢理CriticalSectionとか使って書き込んでもデッドロックすることがあるから。
メッセージキューはIPCとしての信頼性が不安だわ。
マウスやらキーボードやらのイベント入ってきていつ溢れるか分からない。
マウスとか忙しいと捨てられてるし。
普通にデータ受け渡すくらいならよっぽどのへぼ打たなければデドロックはしないでしょ。
子スレッド(多数)から親スレッドの持つ1個のリストビューにアイテム追加するとか。
SendMessageして親スレッドでAddItemとかさせないと、リストの上にマウスかざしただけで即デッドロックするおw
イベントやらセマフォやら使えるんだから、スレッド間通信の道具なんかいくらでも作れるだろ。
>>981 はセマフォじゃなくてミューテクスか・・・
例えば std::deque<> あたりの出し入れをスレッドセーフにするだけでも使えるでしょ?
読み出す側は同期的に待つならイベントが使えるだろうし、
非同期にやるなら追加したあと PostMessage() することにするとかさ。
>>900 デッドロックしてくれなかったら、逆に困るに10000ディナール。
>>983 えっと非同期の方法を応用すると、
EnterCriticalSection→親スレッドのコンテナに追記→LeaveCriticalSection→PostMessage(リストに反映汁)
でええんかな。
俺の場合、実はリストビューは大概オーナーデータにするので、データだけを更新するとか、ある程度は融通は利く。
まぁいちおう考慮してみますわ。
ただ、SendMessageだと親スレッドが処理が終わるまで子スレッドがストールする、という
問題については、現状たいした問題じゃなかったりする。
リストへの追記の頻度がそれほど高いわけでもないし、状況次第。
実際問題、リストに登録する以外の使い道のないデータなんで汎用性持たせてもそんなに意味は無かったりする。
>>984 まー、さすがにデータ1件ずつにつきメッセージ投げるようなヴァカな真似はしてない。
スレッドごとにバッファメモリを用意して、ある程度まとまったデータにしてから配列で渡してる。
WM_SENDDATAってメッセージもあるくらいだし、メッセージキューにアドレス入れて
非同期でデータ交換するのって一般的だと思ってたんだけど。
>>985 リストビューの実装をオーナーデータにすべき。
データベースメモリと別に、わざわざリストコントロール内にデータベースが存在する時点で厨確定。
とりあえず、LVS_OWNERDATA で検索すべき。
いちいちPostMessageとかで通知しないで、親は暇なときに自分で子スレッドからの
データがあるかどうか見て、なんかあればあるだけ処理しちゃうというのもいいかも。
>>986 普通にオーナーデータにしてるが、CListViewCtrlImpl<Foo>とコンテナクラスを多重継承したクラス構成にしているwww
>>985 >WM_SENDDATAってメッセージもあるくらいだし、メッセージキューにアドレス入れて
>非同期でデータ交換するのって一般的だと思ってたんだけど。
ちっとも一般的じゃない。
外部プロセスから作為的なメッセージを受信した場合、
それが正しいアドレスかどうか検出する方法がない。
セキュリティに配慮したアプリケーションを作るなら、
アクセス制限された共有メモリとイベント通知でデータ送信をするしかない。
そういいつつ、自分も面倒だからそこまでやらないけどさ。
>>987 OnIdleに噛ますのか。それアリだな。
子スレッドがアクティブなときもリストの項目ソートしたり削除したりできるようにしてるのだが
全部の操作にいちいちロック・アンロックかけるのも面倒なのよ。
親ウィンドウを持つスレッドのみが直接データモデルを操作するほうが現状楽だったり。
>>989 ・・・多重継承は要らんでしょ。移植・仕様変更に弱くなるだけだよ。
時には、似た処理内容をコンソールアプリで提供しなけばならなくなったりするでしょ。
次のお題はLVS_OWNERDATAでチェクーボクース出す方法について。
>>993 そろそろスレ違いっぽいので、Win32API質問スレでおながいします。
というか、もうすぐ1000。
1000!!
'A`TL
^w^ TL
もうすぐ1000!
もらっときます。
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。