0

我正在尝试在 C# 中构建一个进程外 COM 服务器。我从微软找到了这个例子: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())

我不明白这两个电话之间的区别。我需要第二种形式,因为我想从只有第二种方式可用的环境中拨打电话。

我可以对服务器进行哪些更改以使其正常工作?

4

1 回答 1

0

好的,我经常自己找到解决方案。实际上:

GetObject("", "CSExeCOMServer.CSSimpleObject")

与以下内容相同:

CreateObject("CSExeCOMServer.CSSimpleObject")

如果您正在寻找一个设计不佳的 API,我已经找到了一个(但我不知道整个故事,可能这里有人可以解释我为什么会这样)。

我的问题是微软示例没有在 ROT(运行对象表)中注册对象。因此 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 回答