我正在尝试为 3rd 方产品编写插件。这采用本机 C++ DLL 的形式,它从提供的类型库实现指定的接口。我的插件加载成功,接口描述的方法在预期点被调用,我可以从我的插件中写出一个日志文件并查询一个 Web 服务,到目前为止一切都很好。
但是,对于我的插件查询主程序,该Initialize()
方法传递了一个IDispatch
接口。我正在尝试将此接口与如下代码一起使用:
Initialize(LPDISPATCH pDispArchivingControl) {
LPOLESTR ptName = L"currentVaultId";
HRESULT hr= pDispArchivingControl->GetIDsOfNames(IID_NULL, &ptName, 1,
LOCALE_USER_DEFAULT, &dispID);
// add parameters, etc
hr = pDispArchivingControl->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD, &dp, pvResult, NULL, NULL);
// hr = 0x80020003 Member not found.
}
第一部分,GetIDsOfNames()
,做了我认为应该做的事情,即将程序文档中的方法名称放入ptName
给我不同的值dispID
- 15、27,等等。
第二部分,Invoke()
始终返回 HRESULT 0x80020003(未找到成员)。
我在这里找到了一些解决方案:HOWTO: Troubleshoot "Member Not Found" 0x80020003 Error。对于解决方案 1,我尝试将 DISPATCH_METHOD 和 DISPATCH_PROPERTYGET 作为第四个参数。我是否正确假设 2 和 3 不能适用于我,因为我在 dispID 中取回了值?我也不确定如何更改这些。
我现在有点想不通,谷歌没有进一步帮助我 - 有人能建议下一步做什么吗?
更新:这是 oleview 中的一种方法。我在树视图中找不到它,但能够使用 File > View TypeLib 打开它...