ActiveXDllを複数のブラウザから呼び出すには?

解決


春三  2004-03-03 19:40:11  No: 112175  IP: [192.*.*.*]

【環境】Win2000/VB6.0 SP5

現在、ActiveXDllを作成し、それを複数ブラウザから
呼び出して処理を行う作業をしたいと考えています。
このときに、Dll内のグローバル変数に値を格納すると、
上書きされてしまっているような動作になっています。

これを回避する方法は、何かあるのでしょうか?

編集    削除
岡田 之仁  2004-03-04 06:57:39  No: 112176  IP: [192.*.*.*]

VB で作成したActiveX DLL と言うことですネ!

通常は、VC++ でMFC で作成すれば、使用するメモリエリアは
#pragma等の設定や、DLLをロードした瞬間に呼び出される関数
があり、そこでメモリの定義が可能なのですが・・・

VBで行う場合、必ず約束ごととして、ひとつのEXEから
一度しか呼ばない関数を作成し、それをコールすることで、
グローバル変数の配列の配列番号を特定させ、ハンドルとして
EXE側に返し、以降のActiveX DLLの呼び出しでは、その返さ
れたハンドル(配列変数の番号)を渡して、各々のプロセスの
グローバル変数を競合しないようにする・・・

と言うのが簡単かと・・・

お解りになりましたでしょうか?

以上。

編集    削除
春三  2004-03-04 23:38:24  No: 112177  IP: [192.*.*.*]

岡田様、お返事ありがとうございました。

岡田様の方法で試してみようと思ったのですが、
修正点があまりに多くなりそうで・・・
今回は断念せざるを得ませんでした。

書き込みをした後も、いろいろ調べた結果
スレッドモデルが「シングルスレッド」になっていることが
問題ではないかと思い(扱っているコンポーネントの一つが
シングルスレッドコンポーネントでした)、
そこを他のコンポーネントに変え、回避できないかと思っております。

ひとまず「解決」とさせていただきますが、この件に関して
認識ミス・気になること等ありましたら、お知らせいただけるとありがたいです。

編集    削除
魔界の仮面弁士  2004-03-05 04:34:39  No: 112178  IP: [192.*.*.*]

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 コンポーネントの作成方法]
        └[コード コンポーネントの作成技術]
          └[スケーラビリティとマルチスレッド]
            └[マルチスレッドのアウトプロセス コンポーネントのデザイン]

編集    削除
春三  2004-03-05 22:59:14  No: 112179  IP: [192.*.*.*]

魔界の仮面弁士様、お返事ありがとうございます。

現在、ActiveX EXEを使用した方法に修正しようとしているところなのですが、
[スレッドモデル]を[アパートメントスレッド]に変更したあと、
ActiveX EXEを呼び出し(ここでEXCELを用いて処理しています)、
処理を行おうとする段階で、エクセルのアプリケーションエラー
『0x6cdc19f4" の命令が"0x00000000" のメモリを参照しました。
メモリが"read"になることはできませんでした。』
といったメッセージが出てしまい、先に進めなくなってしまっております。

この問題が解決した後で、報告させていただきたいと思います。
返信が遅くなってしまい、申し訳ありませんでした。

編集    削除