COM Interop - 未找到会员

时间:2012-04-18 17:05:05

标签: c++ com

我正在尝试为第三方产品编写插件。它采用本机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 ...

method seen in oleview

1 个答案:

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

现在一切正常,加上我现在的代码更少 - 谢谢!