我正在包装一个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。不知道。我知道我猜他们并没有成功。据我所知,直觉支持论坛不再活跃。
答案 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