【環境】Win2000/VB6.0 SP5
現在、ActiveXDllを作成し、それを複数ブラウザから
呼び出して処理を行う作業をしたいと考えています。
このときに、Dll内のグローバル変数に値を格納すると、
上書きされてしまっているような動作になっています。
これを回避する方法は、何かあるのでしょうか?
VB で作成したActiveX DLL と言うことですネ!
通常は、VC++ でMFC で作成すれば、使用するメモリエリアは
#pragma等の設定や、DLLをロードした瞬間に呼び出される関数
があり、そこでメモリの定義が可能なのですが・・・
VBで行う場合、必ず約束ごととして、ひとつのEXEから
一度しか呼ばない関数を作成し、それをコールすることで、
グローバル変数の配列の配列番号を特定させ、ハンドルとして
EXE側に返し、以降のActiveX DLLの呼び出しでは、その返さ
れたハンドル(配列変数の番号)を渡して、各々のプロセスの
グローバル変数を競合しないようにする・・・
と言うのが簡単かと・・・
お解りになりましたでしょうか?
以上。
岡田様、お返事ありがとうございました。
岡田様の方法で試してみようと思ったのですが、
修正点があまりに多くなりそうで・・・
今回は断念せざるを得ませんでした。
書き込みをした後も、いろいろ調べた結果
スレッドモデルが「シングルスレッド」になっていることが
問題ではないかと思い(扱っているコンポーネントの一つが
シングルスレッドコンポーネントでした)、
そこを他のコンポーネントに変え、回避できないかと思っております。
ひとまず「解決」とさせていただきますが、この件に関して
認識ミス・気になること等ありましたら、お知らせいただけるとありがたいです。
MSDNライブラリのキーワード検索で、
プロセス間通信
Coffee2.vbp サンプル アプリケーション
アパートメント モデルのスレッド
などについて調べてみてください。比較的簡単に実装できますよ。
> 現在、ActiveXDllを作成し、それを複数ブラウザから
そのような目的であれば、ActiveX DLLではなく、ActiveX EXEを使いましょう。
ActiveX DLLはインプロセス、ActiveX EXEはアウトプロセスで動作します。
そして、IEを複数起動した場合には、ブラウザごとに異なるプロセスが
割り当てられます。(IE上で[Ctrl]+[N]された場合などは同一プロセスですが)
ActiveX DLLだと、ブラウザごとに異なるインスタンスが生成されるため、
「同一ブラウザ上で複数呼び出された時」の値の共有ならば良いですが、
「異なるブラウザ間で呼び出された時」に対応させるのは大変になってしまいます。
> スレッドモデルが「シングルスレッド」になっていることが
> 問題ではないかと思い(扱っているコンポーネントの一つが
その[スレッドモデル]のオプション設定は無関係ではありませんが、
EXEで実装させる場合、コンボボックス(ドロップダウンリスト)ではなく、
その下にある[スレッド プール]の設定が重要になってきます。
今回の場合は、スレッドプールを 1 に設定しておくのが良いでしょう。
これに関しては、MSDNライブラリの以下の項を参照してください。
[Visual Studio 6.0 ドキュメント]
└[Visual Basic ドキュメント]
└[Visual Basic の使用方法]
└[コンポーネント ツール ガイド]
└[ActiveX コンポーネントの作成方法]
└[コード コンポーネントの作成技術]
└[スケーラビリティとマルチスレッド]
└[マルチスレッドのアウトプロセス コンポーネントのデザイン]
魔界の仮面弁士様、お返事ありがとうございます。
現在、ActiveX EXEを使用した方法に修正しようとしているところなのですが、
[スレッドモデル]を[アパートメントスレッド]に変更したあと、
ActiveX EXEを呼び出し(ここでEXCELを用いて処理しています)、
処理を行おうとする段階で、エクセルのアプリケーションエラー
『0x6cdc19f4" の命令が"0x00000000" のメモリを参照しました。
メモリが"read"になることはできませんでした。』
といったメッセージが出てしまい、先に進めなくなってしまっております。
この問題が解決した後で、報告させていただきたいと思います。
返信が遅くなってしまい、申し訳ありませんでした。