代码之家  ›  专栏  ›  技术社区  ›  rsenna

C COM类-显示未知名称

  •  2
  • rsenna  · 技术社区  · 14 年前

    我已经在C中声明了一个COM可见类。代码如下:

    [ComVisible(true)]
    public class AComVisibleClass : TheParentClass
    {
        public bool SomeFunc(string id)
        {
            return true;
        }
    
    }
    

    这个类由工厂类实例化,也可以访问COM。

    但是如果我尝试在一个vb脚本文件中访问, DISP_E_UNKNOWNNAME 引发异常。

    这是我们在这里工作的一个已有的图书馆的新课程。所有其他类都可以通过COM访问。整个库被编译成一个程序集文件。我已使用注册了新程序集 regasm 但是我还是得到了这个例外。

    我尝试使用VS2008调试COM调用。工厂类似乎能够实例化 AComVisibleClass . 只有在工厂尝试执行时才会引发上述异常 SomeFunc .

    我知道这听起来可能有点(?)有点含糊,但我不能在这里公开真正的代码。如果有人需要更多信息,请问我。

    2 回复  |  直到 14 年前
        1
  •  4
  •   user128300    14 年前

    我可以想到这个问题的三个可能原因:

    原因1:CreateObject中使用了错误的名称:

    我想您的vbscript代码调用 类似的东西 这是:

     Set obj = CreateObject("MyLibrary.AComVisibleClass")
    

    如果这是正确的,请打开注册表编辑器并检查 HKEY_CLASSES_ROOT 键包含名为 MyLibrary.AComVisibleClass . 如果没有,那么您的库名称可能与预期的不同。在注册表中搜索 AComVisibleClass 查找正确的库名称。

    原因2:64位问题:

    如果问题发生在64位操作系统上,原因可能是vbscript作为32位进程运行,而c_com dll为64位,反之亦然。

    原因3:函数名错误:

    脚本中可能使用了错误的函数名,例如 obj.SomeFnc(1) 而不是 obj.SomeFunc(1) ,或者您选择的函数名是vbscript中的保留关键字,或者包含异常字符。

        2
  •  0
  •   Community CDub    7 年前

    听起来你需要支持 IDispatch .

    退房 Does C# .NET support IDispatch late binding?

    编辑

    这个答案可能是错误的,我可能最终还是会删除它。现在,它似乎增加了价值,所以我会让它保留下来。