DLL内のスレッドからVBの関数を呼ぶには?
■ このスレッドは過去ログ倉庫に格納されています
0001藤井
NGNGDLLに渡し、DLL内で作られたスレッドからその関数をコールバックしたいのですが、
うまくできません。
VBの開発環境から実行させた場合は出来るのですが、EXEにして実行すると
エラーを起こしてしまいます。
なにかいい方法を教えいただけないでしょうか?
OS:Windows98
DLL:VC6で開発(SDK)
VB6
よろしくお願いいたします。
0002名無しさん@1周年
NGNGギコ猫様にでも聞いてみたら?
0003名無しさん@1周年
NGNGスレッドセーフなど考慮していない糞ランタイムが誤作動して死にます
また糞VBでスレッドを使おうとする人間も糞なので、糞まみれです
処置方法はバキュームカーで吸い取ってもらうしかありません
0004藤井
NGNG0005名無しさん@1周年
NGNG0006>1
NGNGといってもC++が使えるわけでもないので本物のカスなのでしょう。
もう少し知識のある人間のいる掲示板で聞くことをお勧めします。
お勧めはしませんが有名なところでYahooとかね。
0007>1
NGNGポーリングにするのが楽でしょう。
どうしてもというならウインドハンドルを渡しておいてメッセージで
きっかけを貰っては?
0008名無しさん@1周年
NGNG0009>8
NGNGActiveXコントロールにしようが、
他のスレッドが通った時点で死ぬのは変わらないんだけど
0010名無しさん@1周年
NGNGVB側で実行させた後その出力を名前なしパイプとかで受け取るのはどうでしょうか?
0011>10
NGNGただ、パイプはwin95で使えないから注意。
0012>11
NGNG名前なしパイプはWin95/98でも使えたはず。
001311>12
NGNG結局 メッセージを投げて貰うのが一番楽じゃないかな
0014>1
NGNGワーカーではなく、メインスレッドから行えばよいと思い
ます。
>9
これも一緒。
0015名無しさん@1周年
NGNG>もう少し知識のある人間のいる掲示板で聞くことをお勧めします。
>お勧めはしませんが有名なところでYahooとかね。
お勧めの掲示板を教えてください。お願いします。
0016>15
NGNGもっと上手に聞けて具体的なコードの話に持ってゆければ
そりゃどこでも情報は出るかもしれないけど、その場合で
もここが一番早いと思うよ。
0017>15
NGNG0018夏になるとワイドショーでやってます
NGNG0019藤井
NGNGコールバックを実現することができました。
VBでのマルチスレッドの動作を調べてみたところ、
DLLへのアクセスはスレッド毎にアパートメントという区切られた空間(?)で
行われているらしく、コールバックされる関数への口も
そこにあるようなのです。
DLLで独自に作成されたスレッドからはそのアパートメントへ
アクセスすることができないため、エラーになっていたようです。
14さんのおっしゃる通りでした。
つまり、コールバックするためには関数のポインタを
渡したメインスレッドから行わなければいけませんでした。
結局、DLL内でメッセージ監視用に作成していたVBウィンドウを親にした
デーモンウィンドウにPostMessageを行ってメインスレッドの実行権を得て、
そこからコールバックを行いました。
作成する物がDLLと決まっており、
アプリケーションは他が開発するので、
どうしてもDLLのみで実現しなければなりませんでした。
13さんの察する通り、非同期I/Oの完了を伝えたかったのです。(>13 よくわかりましたね!)
報告、一度終わります。
0020名無しさん@1周年
NGNG私もActiveX内で別スレッド起こすことありますが、イベントを
送るときは、いったんActiveX内のメインウインドウ
(MFCのCOleControl)へスレッドからメッセージを送り、
そのメインウインドウからイベントをVBアプリ本体へ送ってます。
ActiveX内ではいろいろ排他していますが、VBアプリで落ちたこと
は今までありません。直接スレッドからイベントを送ったりすると
まずそうな気がします。
■ このスレッドは過去ログ倉庫に格納されています