C++ COM互操作-未找到成员

C++ COM互操作-未找到成员,c++,com,C++,Com,我正在尝试为第三方产品编写插件。这是一个本地C++的DLL形式,它从提供的类型库中实现指定的接口。我的插件加载成功,接口描述的方法在预期的时间点被调用,我可以从插件中写出一个日志文件并查询web服务,到目前为止还不错 但是,对于查询主程序的插件,Initialize()方法会传递一个IDispatch接口。我正在尝试将此接口与以下代码一起使用: Initialize(LPDISPATCH pDispArchivingControl) { LPOLESTR ptName = L"current

我正在尝试为第三方产品编写插件。这是一个本地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(未找到成员)

我发现这里列出了一些解决方案:。对于解决方案1,我尝试将DISPATCH_方法和DISPATCH_PROPERTYGET作为第四个参数。我假设2和3不能应用于我,因为我正在dispID中获取值,这对吗?我也不知道如何改变这些

我现在已经没有主意了,谷歌也不再帮我了——有人能建议下一步怎么做吗


更新:这是oleview中其中一个方法的外观。我在树视图中找不到它,但可以用文件>视图类型库打开它


Hans Passant和Rup在评论中给出的这个问题的正确答案不是使用后期绑定,而是导入类型库

我把它放在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;
}

现在一切都很好,加上我现在的代码少了很多-谢谢

听起来不像是一种方法。我们看不到dp,它实际上是一个索引属性?当您有一个类型库时,为什么要使用后期绑定?用Oleview看它。exe@HansPassant我使用的是后期绑定,因为我不知道我在做什么:我对C++和com很陌生。我也尝试过在类型库中使用#import,但无法解决如何将传递的接口连接到它-我尝试创建一个实例并将接口分配给它,它进行编译,但在运行时给出“无效指针”。进口对这种情况更好吗?或者其他什么?如果幸运的话,导入应该创建一个
IArchivingControl
接口,甚至可能创建一个
IArchivingControlPtr
ATL智能指针类。如果您有智能指针,那么只需尝试将您的IDispatch分配给它,并查看您是否得到一个非空对象,然后可以对其进行调用。如果没有智能指针,请尝试使用IID_iarchiving控件在IDispatch上调用
QueryInterface
,它会为您创建一个iarchiving控件接口。完成后,别忘了
释放它们。我们是如何从“海龟计数”变成“currentVaultId”的?它们是两个非常不同的源代码管理程序。乌龟是免费软件SVN的包装。我听说过Vault,那是一个商业SCCS。您是否试图使用后期绑定来忽略程序之间的基本差异?“这是一条失败的鲸鱼!”汉帕桑很抱歉弄混了——代码示例只是几行示例,说明了我在做什么。屏幕截图是真正的类型库。我在
GetIDsOfNames()
中使用了真正的函数名,我使用了产品提供的文档