0

C# でアウトプロセス COM サーバーを構築しようとしています。Microsoft からこの例を見つけました: http://support.microsoft.com/kb/977996

私はそれをビルドし、少しの VBScript でテストしました:

Set app = GetObject("", "CSExeCOMServer.CSSimpleObject")
WScript.Echo(app.HelloWorld())

それは機能しますが、私がこれを好むときはそうではありません (GetObject の最初の引数をスキップします):

Set app = GetObject(, "CSExeCOMServer.CSSimpleObject")
WScript.Echo(app.HelloWorld())

この 2 つの呼び出しの違いがわかりません。2 番目の方法しか利用できない環境から電話をかけたいので、2 番目の方法が必要です。

これを機能させるには、サーバーに何を変更できますか?

4

1 に答える 1

0

わかりました、よくあることですが、私は自分で解決策を見つけました。実際には:

GetObject("", "CSExeCOMServer.CSSimpleObject")

は次と同じです:

CreateObject("CSExeCOMServer.CSSimpleObject")

あなたが設計の悪い API を探していたなら、私はそれを見つけました (しかし、私はその全体像を知りません。なぜこのようなものなのかを説明できる人がここにいるかもしれません)。

私の場合の問題は、Microsoft のサンプルが ROT (Running Object Table) にオブジェクトを登録しないことです。したがって、GetObject 呼び出しはアクティブなオブジェクトを見つけることができません。このメソッドをコンストラクターに追加した後、クラスのインスタンスを作成することでこれを解決しました。

public void AddToROT()
{
    IRunningObjectTable rot = null;
    IMoniker moniker = null;
    try
    {
        // Get the ROT
        rot = GetRunningObjectTable(0);

        // Create a moniker for the graph
        moniker = CreateItemMoniker("!", "{" + CLASS_ID  + "}");

        // Registers the graph in the running object table
        cookie = rot.Register(ROTFLAGS_REGISTRATIONKEEPSALIVE, this, moniker);
    }
    finally
    {
        if (null != moniker) Marshal.FinalReleaseComObject(moniker);
        if (null != rot) Marshal.FinalReleaseComObject(rot);
    }
}
于 2013-01-17T14:03:32.633 に答える