【发布时间】:2016-04-29 23:31:47
【问题描述】:
我正在包装一个 COM API 最终,我试图将更多代码推送到泛型中,而 api 中的继承模式没有帮助。
我有一个通用的 IBase, 有大约 80 个类代表结果集。它们非常相似,但它们都继承,或者说实现了非常基本的 IBase。
我已经尝试过扩展方法,但我不认为这是要走的路,因为 com 是后期绑定的,使用 Reflection.PropertyInfo 似乎是死路一条。
在泛型中,我们有子类型,所以我想我可以使用 InvokeMember 来调用我需要的方法/属性。
instnc = Activator.CreateComInstanceFrom(assy, tyepname)
retClass = Type.GetTypeFromProgID(progId)
我的挑战是找不到 progId。 我搜索了注册表,我做了很多猜测。 “Excel.Application”有效,所以基本方法是可靠的。
有问题的 com dll 是 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 实现者)是可实例化的,它们显然是实例化的。但是 typelib 并没有放弃它的秘密。回到最初的问题,除非我能得到 progId,否则我认为没有答案。 progId 可能会被故意混淆。不知道。我知道我猜测他们并没有成功。据我所知,直觉支持论坛不再活跃。
【问题讨论】:
-
谢谢,你能评论一下这个问题吗
标签: vb.net reflection com system.reflection qbfc