我正在尝试为第三方产品编写插件。它采用本机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>打开它。查看TypeLib ...
答案 0 :(得分:1)
Hans Passant和Rup在评论中给出的这个问题的正确答案不是使用后期绑定,而是使用#import
类型库。
我把它放在stdafx.h
:
#import "ArchivingControl.tlb" raw_interfaces_only, raw_native_types, named_guids, auto_search
这在我的.cpp文件中:
ArchivingControl::IArchivingControlPtr JTArchivingControlPtr;
STDMETHODIMP CMyClass::Initialize(LPDISPATCH pDispArchivingControl)
{
JTArchivingControlPtr = pDispArchivingControl;
return S_OK;
}
STDMETHODIMP CMyClass::OtherFunction()
{
BSTR pVaultId;
JTArchivingControlPtr->get_currentVaultId(&pVaultId);
return S_OK;
}
现在一切正常,加上我现在的代码更少 - 谢谢!