使用InvokeMember调用COM方法

时间:2016-04-20 21:42:21

标签: vb.net reflection com system.reflection qbfc

我正在包装一个COM API 最终我试图将更多代码推送到泛型中,而api中的继承模式并没有帮助。

我有一个IBase的通用, 这是〜80个代表结果集的类。它们非常相似,但它们都继承或者更确切地实现了非常基本的IBase。

我尝试过扩展方法,我不认为这是要走的路,因为com是后期绑定的,并且使用Reflection.PropertyInfo似乎是一个死胡同。

在泛型中,我们有子类型,所以我想我可以使用InvokeMember来调用我需要的方法/属性。

instnc = Activator.CreateComInstanceFrom(assy, tyepname)
retClass = Type.GetTypeFromProgID(progId)

我的挑战是我无法找到progId。 我搜索了注册表,我做了很多猜测。 " Excel.Application"工作,所以基本的方法是坚实的。

有问题的是Intuit Quickbooks api。 我尝试了很多种

" QBFC13Lib.ICustomerRetList"

我走在正确的轨道上吗?如果是这样,我在哪里可以找到progId? 我应该尝试不同的方法吗?

来自oleView,我在ICustomerRetList中看到了这个

[
  odl,
  uuid(DF331154-953C-4813-BAEC-F65DDBBFEB5B),
  helpstring("ICustomerTypeRetList Interface"),
  dual,
  oleautomation
]
interface ICustomerTypeRetList : IQBBase {
    [id(0x00000004), helpstring("method GetAt")]
    HRESULT GetAt(
                    long index, 
                    [out, retval] ICustomerTypeRet** retVal);
    [id(0x00000005), propget, helpstring("property Count")]
    HRESULT Count([out, retval] long* pVal);
    [id(0x00000006), helpstring("method Append")]
    HRESULT Append([out, retval] ICustomerTypeRet** retVal);
};

来自typeLib的一些更相关的行

有36个接口声明。我认为我们已经确定我们不会追求这些......我们想要实现这些的东西

interface ICustomerMsgRetList;    
interface ICustomerMod;

有许多行引用类型,例如下面的行。这些只是将客户作为财产的对象(例如,采购订单)。这些都是在接口声明中找到的。自从我做C ++以来已经有一段时间了。 IQBBase是指向指针的指针吗?想出来,不需要回答。

HRESULT CustomerRef([out, retval] IQBBaseRef** pVal);    

所以是的,那里可能有工厂。我相信这些对象(ICustomerRetList实现者)是可实例化的,它们显然是实例化的。但是类型库并没有放弃它的秘密。回到最初的问题,我不认为有答案,除非我能得到进展。可以有目的地混淆progIds。不知道。我知道我猜他们并没有成功。据我所知,直觉支持论坛不再活跃。

1 个答案:

答案 0 :(得分:1)

你写的"有问题的是Intuit Quickbooks api"。我不太明白,因为那不是DLL的名称。如果您知道DLL,则可以使用Microsoft实用程序OleView和DLL的名称,它将为您显示一个解编译的类型库,您可以在其中查看所有类型,包括ProgIds。

就个人而言,我会使用regedit.exe,然后转到HKEY_CLASSES_ROOT \ TypeLib。从那里我将使用搜索工具搜索" Intuit"或者" quickbooks"找到类型库。如果找到类型库,则可以使用OleView进行浏览。

如果您找不到它,可以查看Quickbooks安装,然后找到其文件路径。找到路径后,转到RegEdit中的HKEY_CLASSES_ROOT并搜索路径。您应该找到一些具有路径的键,如果它们标记为LocalServer32或InProcServer32,它们将为您提供CLSID,并且从CLSID中您可以获得ProgID