【问题标题】:Difference between GetObject("", progId) and GetObject(, progId)GetObject("", progId) 和 GetObject(, progId) 的区别
【发布时间】:2012-12-31 20:28:30
【问题描述】:

我正在尝试用 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())

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

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

【问题讨论】:

    标签: c# com vbscript


    【解决方案1】:

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

    GetObject("", "CSExeCOMServer.CSSimpleObject")
    

    与以下内容相同:

    CreateObject("CSExeCOMServer.CSSimpleObject")
    

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

    我的问题是 Microsoft 示例没有在 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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-29
      • 2012-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多