[リストへもどる]
一括表示

投稿時間:2003/09/03(Wed) 11:53
投稿者名:かず
Eメール:
URL :
タイトル:
ActiveXExe同士の通信について
独立したアプリケーション間で連携を行いたいので、ActiveXExeを2つ作成し
お互いのメソッドをコールできる様にしようと考えています。
ところが、相手のActiveXExeのオブジェクトをGetObject()関数で
取得しようとすると、Nothingで帰ってきます。
ActiveXExeの作り方に問題があるのだろうと思っていますが、、、
なにぶん初めてのトライなのでどこが悪いのか、どうするべきなのかも
わからない状況です。

まずは、GetObject()でActiveXExeのオブジェクトが取得できないという
事象に対して、GetObject()を使うのが正しい選択なのか?他に方法が
あるのか?というところから解決していきたいと思っていますので、
ご存知の方は教えていただけないでしょうか?
よろしくお願いします。

投稿時間:2003/09/03(Wed) 13:31
投稿者名:K.J.K.
Eメール:akiya@koalanet.ne.jp
URL :
タイトル:
Re: ActiveXExe同士の通信について
GetObjectに反応するActiveX EXEにするには、その呼ばれるEXE側で
1,RegisterActiveObject等(ROTに直接登録でも可)を使い登録する。
  Set obj = GetObject(, クラス名)
  の構文だとこれです。
2,IPersistFileをImplementsしておく。
  Set obj = GetObject(ファイル名、クラス名)
  の構文だとこれです。
3,Set obj = GetObject(ファイル名)の構文を使う場合。
  IPersistFileをImplementsするだけでなく、FileMonikorを
  ともなってROTに登録する。

ちなみに、GetObject("", クラス名)ならCreateObject(クラス名)と
同じですよね。

投稿時間:2003/09/03(Wed) 17:05
投稿者名:かず
Eメール:
URL :
タイトル:
Re^2: ActiveXExe同士の通信について
早速の返答ありがとうございます。

まず、ファイル名の指定という部分はアプリケーションがインストールされた
場所を管理する又は、レジストリから取得する?等があるので、構文的には
> 1,RegisterActiveObject等(ROTに直接登録でも可)を使い登録する。
>   Set obj = GetObject(, クラス名)
>   の構文だとこれです。
を採用したいと思ったりしています、、、
が、RegisterActiveObjectについて調べているのですが実際にVBでどう記述
すれば良いのかわかりません。
また後始末?としてRevokeActiveObjectも行う必要があるのですよね?

それと、
> 2,IPersistFileをImplementsしておく。
>   Set obj = GetObject(ファイル名、クラス名)
>   の構文だとこれです。
> 3,Set obj = GetObject(ファイル名)の構文を使う場合。
>   IPersistFileをImplementsするだけでなく、FileMonikorを
>   ともなってROTに登録する。
の方法についても、IPersistFileとかImplementsとかの意味がいまいち
よく分かっていないという事もあって、どういう場合にどの方法が最適なのか
という部分で悩んでいます。
どの方法も基本的に実現できる事は同じなのかもしれませんが、、、

大変あつかましいお願いかもしれませんが、できればその辺も含めて
説明いただけるとありがたいと思います。
よろしくお願いします。

投稿時間:2003/09/03(Wed) 17:18
投稿者名:かず
Eメール:
URL :
タイトル:
Re^2: ActiveXExe同士の通信について^2
分からないなりにいろいろとやってみているのですが、

> ちなみに、GetObject("", クラス名)ならCreateObject(クラス名)と
> 同じですよね。

下記の様にする事で、お互い口が利ける様になりましたが、、、
こんな方法(簡単にコメントで書いてみます)でやってみたのですが、
正しい方法なのでしょうか?(スマートではない?)

=== ActiveXExe1.exe =================================================
--- Module1 ----------------------------------------
Sub main()
    ' 二重起動防止
    ' Class1のオブジェクト作成
End Sub

--- Class1 ----------------------------------------
Private Sub Class_Initialize()
    ' Form1を表示
End Sub

Private Sub Class_Terminate()
    ' Form1を表示
End Sub

Public Sub ShowMsg()
    ' フォーム1にメッセージ表示
End Sub

--- Form1 ----------------------------------------
Private Sub Command1_Click()
    ' ActiveXExe2のオブジェクトをCreateObjectで取得
    ' ActiveXExe2のオブジェクトのメソッド実行
End Sub

=== ActiveXExe2.exe =================================================
' 内容はActiveXExe1.exeと同じ。

投稿時間:2003/09/03(Wed) 21:19
投稿者名:K.J.K.
Eメール:akiya@koalanet.ne.jp
URL :
タイトル:
Re: ActiveXExe同士の通信について
GetObjectを使わなければならない状態、というのはそう多くはない
でしょう。インスタンス作成はCreateObjectで十分では。

呼び出される側のインスタンスが1つであることが要求されるのなら、
ClassのInstancingプロパティを5(MultiUse)にしておけばいいでしょうし。

ちなみに、RegisterActiveObjectなどを使う場合は、自クラスのCLSID
を取得する必要がありますが、VBのコードで得るのはちょっと面倒かも
知れません。

PersistableにしてIPersist.GetClassIDを使うなら、タイプライブラリ
が必要になります。かと言って、IDispatchを補助する他のインターフェース
を使うと、もっと面倒になりますし。

投稿時間:2003/09/04(Thu) 14:27
投稿者名:かず
Eメール:
URL :
タイトル:
Re^2: ActiveXExe同士の通信について
ヘルプにもあったのですが確信できなかったので、、
いただいたレスが参考になりました。
ありがとうございました。

> GetObjectを使わなければならない状態、というのはそう多くはない
> でしょう。インスタンス作成はCreateObjectで十分では。
>
> 呼び出される側のインスタンスが1つであることが要求されるのなら、
> ClassのInstancingプロパティを5(MultiUse)にしておけばいいでしょうし。
>
> ちなみに、RegisterActiveObjectなどを使う場合は、自クラスのCLSID
> を取得する必要がありますが、VBのコードで得るのはちょっと面倒かも
> 知れません。
>
> PersistableにしてIPersist.GetClassIDを使うなら、タイプライブラリ
> が必要になります。かと言って、IDispatchを補助する他のインターフェース
> を使うと、もっと面倒になりますし。