アパートメントスレッドモデルのActiveX EXEにおいて、後から起動したスレッドが、すでに作成済みのオブジェクトのインスタンスを取得する方法を探しています。
ActiveX EXEではクラスのInstancingを3-SingleUseにすると、2回目のオブジェクト作成で、自身のEXEがもう一つ起動するだけで、既存のインスタンスを返してくれません。
ActiveX EXEでは、標準モジュールのPublic変数は各スレッドごとの変数となってしまい、本当の意味でのPublic変数が作成できません。
このため、1つめのインスタンスが作成されたときに標準モジュールのPublic変数に自身を保持しても、他のスレッドからは見えず、他のスレッドが作成されたときに、既存のインスタンスの存在を確かめることができません。
(プロジェクトの種類をActive X EXE、スレッドモデルをオブジェクトごとのスレッド、スタートアップをSub Main、コンポーネントのスタートモードを独立型に設定、開発環境ではシングルスレッドで動作するのでコンパイルしてから実行)
-----
Module Module1
Public Hoge As Class1
Sub Main
If Hoge Is Nothing Then
MsgBox "新規にインスタンスを作成"
'既存のインスタンスがなければ作成
Set Hoge = CreateObject("Project1.Class1")
'しかし、このコードは必ず実行される。
Else
MsgBox "既存のインスタンスを使用"
End If
Hoge....
End Sub
-----
Class Class1
Private Sub Class_Initialize()
'インスタンスが作成されたら自身をグローバルに保持する(つもり)
Set Hoge = Me
End Sub
新しいインスタンスの作成元がすでに存在しているインスタンス自身であれば、新しいインスタンスに自身の参照を渡してやることで解決しますが、作成元が外部のプログラムなどである場合、すでに存在しているインスタンスの存在を確かめるすべがないのです。
起動時にファイルにフラグを立てるなどの方法で、すでにインスタンスが存在するかどうかだけなら確認できますが、既存のインスタンスを操作することはできません。
どなたか解決方法をお持ちでないでしょうか。
ツイート | ![]() |