2

我正在尝试为 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 打开它...

oleview 中看到的方法

4

1 回答 1

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;
}

现在一切都运行良好,而且我现在的代码更少了 - 谢谢!

于 2012-04-19T14:38:07.183 回答