ATL/WTL Part3

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2005/12/06(火) 14:32:53
日本語の不得手な方がまだいらっしゃるようで
953デフォルトの名無しさん:2005/12/06(火) 18:38:45
先生、質問です。
これはいけないことですか?

CAtlArray<IHTMLDocument2*> pHTMLArray;

void hoge(IHTMLDocument2 *pDoc)
{
 pHTMLArray.Add(pDoc);
}
954デフォルトの名無しさん:2005/12/06(火) 20:43:09
ATL使ってるんならスマートポインタ使おうよ
955デフォルトの名無しさん:2005/12/06(火) 21:04:18
COMのリファレンスカウントをちゃんと守りませう。
956953: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をしてもキーボードフォーカスが移動しないので・・
958デフォルトの名無しさん:2005/12/07(水) 20:52:40
>>957
mouse_event
959デフォルトの名無しさん:2005/12/07(水) 21:25:16
7.5 Final EXE !
960デフォルトの名無しさん:2005/12/08(木) 03:32:05
windows.hみたいなので定義されてる構造体を
COMオブジェクトのプロパティに使いたいのだけれど、
こういうの1つ1つIDLで再定義していくんですか?
具体的にはWAVEFORMATEXをプロパティとするオブジェクトを作りたいのですが。
961デフォルトの名無しさん:2005/12/08(木) 03:54:39
variant
962デフォルトの名無しさん:2005/12/08(木) 04:00:10
>>961
それだとVARIANT型のプロパティになるんですよね?

よくDirectXなんかでDSBUFFERDESCみたいな構造体を
直接受け付ける関数あるじゃないですか。
ああいうのはどうなってるんでしょうか
963デフォルトの名無しさん:2005/12/08(木) 04:38:27
ポインタ
964デフォルトの名無しさん:2005/12/08(木) 05:49:15
すんません、できました。

IDLに#include "windows.h"とやるとコンパイルできなくて、
typedef struct tagWAVEFORMAT { .. } WAVEFORMAT;
とするとIDLのコンパイルは通るのですが
生成されるmyclass.hを使うときにWAVEFORMATの二重定義になって困っていました。

そこでIDLで宣言するときに
cpp_quote("#ifdef WAVEFORMAT")
typedef ...
cpp_quote("#endif")
として、生成されたmyclass.hで無効にしてやると上手くいきました。
965デフォルトの名無しさん:2005/12/09(金) 05:48:48
966デフォルトの名無しさん:2005/12/09(金) 07:20:34
オイオイ
967デフォルトの名無しさん:2005/12/09(金) 14:44:42
なるほどそういう流れか
968デフォルトの名無しさん:2005/12/09(金) 21:14:29
どういう意味?
969デフォルトの名無しさん:2005/12/10(土) 10:51:53
setup71.jsで登録したWTL App Wizardをアンインスコするにはjsを読んで手動で
レジストリを消すとかしないと駄目ですか?
970デフォルトの名無しさん:2005/12/10(土) 15:48:50
>>969

そうかも
俺も2つとか残っててマンドクセーと思ったことが
971デフォルトの名無しさん:2005/12/10(土) 17:53:32
レジストリは変更してないよ?
ファイルをコピーしているだけ
972・∀・)っ-●○◎- ◆Pu/ODYSSEY :2005/12/10(土) 18:08:04
フォルダの中身参照してるだけな。
973969:2005/12/11(日) 00:06:11
>>970-972
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\vcprojectsから
WTL*.vsz, WTL*.vsdir, WTL*.ico を消すだけですね。。
974デフォルトの名無しさん:2005/12/11(日) 02:15:50
WTLはスレッドサポートしてる?
CMutexとかみあたらないんだけど...
975・∀・)っ-●○◎- ◆Pu/ODYSSEY :2005/12/11(日) 02:57:18
無いよ。

Win32APIでがんばりましょう。
普通に_beginthreadex使えるよ。CRT使わないならCreateThread(Ex)ね。
あとはCriticalSectionなりMutexなり。

俺は親スレッドにデータ渡すときは
parent.SendMessage(WM_USER_SENDDATA, (WPARAM)data, (LPARAM)dataSize);
で配列渡してるけどね。メッセージキューの利用はスレッドセーフなのです。
っていうかむしろそれ以外の方法使うの危険。


ATL Serverにはそのものズバリなスレッドクラスがあったけど
使った経験ない。
976デフォルトの名無しさん:2005/12/11(日) 23:42:05
それ以外の方法?
APCとか、IOCPとかは危険?
977・∀・)っ-●○◎- ◆Pu/ODYSSEY :2005/12/11(日) 23:56:10
いや、ごめん。基本的にAPIベースで使える手段は一通り使えるはず。

メッセージキューってのはリストビューとかのウィンドウにデータを渡すときの話ね。
無理矢理CriticalSectionとか使って書き込んでもデッドロックすることがあるから。
978デフォルトの名無しさん:2005/12/12(月) 00:00:06
メッセージキューはIPCとしての信頼性が不安だわ。
マウスやらキーボードやらのイベント入ってきていつ溢れるか分からない。
マウスとか忙しいと捨てられてるし。
979デフォルトの名無しさん:2005/12/12(月) 00:13:30
普通にデータ受け渡すくらいならよっぽどのへぼ打たなければデドロックはしないでしょ。
980・∀・)っ-●○◎- ◆Pu/ODYSSEY :2005/12/12(月) 00:23:55
子スレッド(多数)から親スレッドの持つ1個のリストビューにアイテム追加するとか。
SendMessageして親スレッドでAddItemとかさせないと、リストの上にマウスかざしただけで即デッドロックするおw
981デフォルトの名無しさん:2005/12/12(月) 01:41:57
イベントやらセマフォやら使えるんだから、スレッド間通信の道具なんかいくらでも作れるだろ。
982デフォルトの名無しさん:2005/12/12(月) 01:48:27
>>981
サンプル希望
983デフォルトの名無しさん:2005/12/12(月) 01:57:12
>>981 はセマフォじゃなくてミューテクスか・・・

例えば std::deque<> あたりの出し入れをスレッドセーフにするだけでも使えるでしょ?
読み出す側は同期的に待つならイベントが使えるだろうし、
非同期にやるなら追加したあと PostMessage() することにするとかさ。
984デフォルトの名無しさん:2005/12/12(月) 02:02:30
>>900
デッドロックしてくれなかったら、逆に困るに10000ディナール。
985・∀・)っ-●○◎- ◆Pu/ODYSSEY :2005/12/12(月) 17:18:44
>>983
えっと非同期の方法を応用すると、
EnterCriticalSection→親スレッドのコンテナに追記→LeaveCriticalSection→PostMessage(リストに反映汁)
でええんかな。

俺の場合、実はリストビューは大概オーナーデータにするので、データだけを更新するとか、ある程度は融通は利く。
まぁいちおう考慮してみますわ。
ただ、SendMessageだと親スレッドが処理が終わるまで子スレッドがストールする、という
問題については、現状たいした問題じゃなかったりする。
リストへの追記の頻度がそれほど高いわけでもないし、状況次第。
実際問題、リストに登録する以外の使い道のないデータなんで汎用性持たせてもそんなに意味は無かったりする。


>>984
まー、さすがにデータ1件ずつにつきメッセージ投げるようなヴァカな真似はしてない。
スレッドごとにバッファメモリを用意して、ある程度まとまったデータにしてから配列で渡してる。

WM_SENDDATAってメッセージもあるくらいだし、メッセージキューにアドレス入れて
非同期でデータ交換するのって一般的だと思ってたんだけど。
986デフォルトの名無しさん:2005/12/12(月) 17:33:23
>>985
リストビューの実装をオーナーデータにすべき。
データベースメモリと別に、わざわざリストコントロール内にデータベースが存在する時点で厨確定。
とりあえず、LVS_OWNERDATA で検索すべき。
987デフォルトの名無しさん:2005/12/12(月) 17:34:58
いちいちPostMessageとかで通知しないで、親は暇なときに自分で子スレッドからの
データがあるかどうか見て、なんかあればあるだけ処理しちゃうというのもいいかも。
988デフォルトの名無しさん:2005/12/12(月) 17:37:34
>>986
989・∀・)っ-●○◎- ◆Pu/ODYSSEY :2005/12/12(月) 17:39:21
>>986
普通にオーナーデータにしてるが、CListViewCtrlImpl<Foo>とコンテナクラスを多重継承したクラス構成にしているwww
990デフォルトの名無しさん:2005/12/12(月) 17:41:43
>>985
>WM_SENDDATAってメッセージもあるくらいだし、メッセージキューにアドレス入れて 
>非同期でデータ交換するのって一般的だと思ってたんだけど。 

ちっとも一般的じゃない。
外部プロセスから作為的なメッセージを受信した場合、
それが正しいアドレスかどうか検出する方法がない。
セキュリティに配慮したアプリケーションを作るなら、
アクセス制限された共有メモリとイベント通知でデータ送信をするしかない。
そういいつつ、自分も面倒だからそこまでやらないけどさ。
991・∀・)っ-●○◎- ◆Pu/ODYSSEY :2005/12/12(月) 17:44:48
>>987
OnIdleに噛ますのか。それアリだな。

子スレッドがアクティブなときもリストの項目ソートしたり削除したりできるようにしてるのだが
全部の操作にいちいちロック・アンロックかけるのも面倒なのよ。
親ウィンドウを持つスレッドのみが直接データモデルを操作するほうが現状楽だったり。
992デフォルトの名無しさん:2005/12/12(月) 17:46:57
>>989
・・・多重継承は要らんでしょ。移植・仕様変更に弱くなるだけだよ。
時には、似た処理内容をコンソールアプリで提供しなけばならなくなったりするでしょ。
993・∀・)っ-●○◎- ◆Pu/ODYSSEY :2005/12/12(月) 18:22:55
次のお題はLVS_OWNERDATAでチェクーボクース出す方法について。
994デフォルトの名無しさん:2005/12/12(月) 18:33:18
>>993
そろそろスレ違いっぽいので、Win32API質問スレでおながいします。
というか、もうすぐ1000。
995デフォルトの名無しさん:2005/12/12(月) 21:03:07
立てました。
ATL/WTL Part4
http://pc8.2ch.net/test/read.cgi/tech/1134388951/l50
996デフォルトの名無しさん:2005/12/12(月) 23:00:28
1000!!
997デフォルトの名無しさん:2005/12/12(月) 23:24:37
'A`TL
998デフォルトの名無しさん:2005/12/13(火) 00:50:29
^w^ TL
999デフォルトの名無しさん:2005/12/13(火) 00:54:43
もうすぐ1000!
1000デフォルトの名無しさん:2005/12/13(火) 00:55:20
もらっときます。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。