トップページ⇒prog
20コメント6KB

DLL内のスレッドからVBの関数を呼ぶには?

■ このスレッドは過去ログ倉庫に格納されています
0001藤井NGNG
最初にVBから、コールバックする関数のポインタを
DLLに渡し、DLL内で作られたスレッドからその関数をコールバックしたいのですが、
うまくできません。
VBの開発環境から実行させた場合は出来るのですが、EXEにして実行すると
エラーを起こしてしまいます。

なにかいい方法を教えいただけないでしょうか?

OS:Windows98
DLL:VC6で開発(SDK)
VB6

よろしくお願いいたします。
0002名無しさん@1周年NGNG
こんなところに、新しいスレッドを作るんじゃなくて、
ギコ猫様にでも聞いてみたら?
0003名無しさん@1周年NGNG
VBは糞言語なので、当然スレッドなど使おうものなら、
スレッドセーフなど考慮していない糞ランタイムが誤作動して死にます
また糞VBでスレッドを使おうとする人間も糞なので、糞まみれです
処置方法はバキュームカーで吸い取ってもらうしかありません
0004藤井NGNG
なんとか、どうにかならないものでしょうか?
0005名無しさん@1周年NGNG
ジブンデカンガエロ!!
0006>1NGNG
なんだかんだ逝ってますが、ようはVBもまともに使えないカスばっかりです。
といってもC++が使えるわけでもないので本物のカスなのでしょう。

もう少し知識のある人間のいる掲示板で聞くことをお勧めします。
お勧めはしませんが有名なところでYahooとかね。
0007>1NGNG
スレッドからコールバックを諦めるのが早いでしょう。
ポーリングにするのが楽でしょう。
どうしてもというならウインドハンドルを渡しておいてメッセージで
きっかけを貰っては?
0008名無しさん@1周年NGNG
ActiveXコントロールにすればいいじゃん。
0009>8NGNG
VBのランタイムを使う限り、
ActiveXコントロールにしようが、
他のスレッドが通った時点で死ぬのは変わらないんだけど
0010名無しさん@1周年NGNG
別スレッドで動かしたい部分だけを別に実行ファイルにしたものを作って
VB側で実行させた後その出力を名前なしパイプとかで受け取るのはどうでしょうか?
0011>10NGNG
ああマルチタスクにしてしまうという手ね。それいいんじゃない。
ただ、パイプはwin95で使えないから注意。
0012>11NGNG
名前付きパイプは確かに使えないけど
名前なしパイプはWin95/98でも使えたはず。
001311>12NGNG
あ、そうでしたか。 でも、ReadFileをどう同期するかで悩みそうですね
結局 メッセージを投げて貰うのが一番楽じゃないかな
0014>1NGNG
おそらく、VBアプリケーションのマルチスレッド制限です。
ワーカーではなく、メインスレッドから行えばよいと思い
ます。

>9
これも一緒。
0015名無しさん@1周年NGNG
>6
>もう少し知識のある人間のいる掲示板で聞くことをお勧めします。
>お勧めはしませんが有名なところでYahooとかね。

お勧めの掲示板を教えてください。お願いします。
0016>15NGNG
はは、どこに行ってもこれ以上の情報は出ないよ
もっと上手に聞けて具体的なコードの話に持ってゆければ
そりゃどこでも情報は出るかもしれないけど、その場合で
もここが一番早いと思うよ。
0017>15NGNG
あなたのいない掲示板です
0018夏になるとワイドショーでやってますNGNG
あなたのいらない世界
0019藤井NGNG
皆様からヒントを頂いたおかげでなんとかスレッドからの
コールバックを実現することができました。
VBでのマルチスレッドの動作を調べてみたところ、
DLLへのアクセスはスレッド毎にアパートメントという区切られた空間(?)で
行われているらしく、コールバックされる関数への口も
そこにあるようなのです。
DLLで独自に作成されたスレッドからはそのアパートメントへ
アクセスすることができないため、エラーになっていたようです。
14さんのおっしゃる通りでした。

つまり、コールバックするためには関数のポインタを
渡したメインスレッドから行わなければいけませんでした。
結局、DLL内でメッセージ監視用に作成していたVBウィンドウを親にした
デーモンウィンドウにPostMessageを行ってメインスレッドの実行権を得て、
そこからコールバックを行いました。

作成する物がDLLと決まっており、
アプリケーションは他が開発するので、
どうしてもDLLのみで実現しなければなりませんでした。

13さんの察する通り、非同期I/Oの完了を伝えたかったのです。(>13 よくわかりましたね!)

報告、一度終わります。
0020名無しさん@1周年NGNG
19さんの方法で良いと思います。
私もActiveX内で別スレッド起こすことありますが、イベントを
送るときは、いったんActiveX内のメインウインドウ
(MFCのCOleControl)へスレッドからメッセージを送り、
そのメインウインドウからイベントをVBアプリ本体へ送ってます。
ActiveX内ではいろいろ排他していますが、VBアプリで落ちたこと
は今までありません。直接スレッドからイベントを送ったりすると
まずそうな気がします。
■ このスレッドは過去ログ倉庫に格納されています