首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >对VB6接口方法的后期绑定调用

对VB6接口方法的后期绑定调用
EN

Stack Overflow用户
提问于 2016-07-28 18:08:31
回答 1查看 480关注 0票数 0

在我的C++程序中,我使用一个COM类,它是在VB6 COM DLL中实现的。让我们把这个类称为CETicketRA。该类具有类型为AppliedPromotion的属性IPositionPromotionIPositionPromotion是由同一个VB6 COM DLL定义的接口。它具有我试图从C++访问的各种属性和方法。

考虑到以下代码:

代码语言:javascript
代码运行次数:0
运行
复制
IDispatch* pETicketRA = NULL;
DISPPARAMS dispParams = {0};
VARIANT result;
VariantInit(&result);
// Left out: some code to set pETicketRA ...

OLECHAR* strAppliedPromotion = L"AppliedPromotion";
DISPID dispIDAppliedPromotion = -1;
HRESULT hr = pETicketRA->GetIDsOfNames(IID_NULL, &strAppliedPromotion, 1, LOCALE_SYSTEM_DEFAULT, &dispIDAppliedPromotion);
hr = pETicketRA->Invoke(dispIDAppliedPromotion, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &dispParams, &result, NULL, NULL);
IDispatch* pPromo = NULL;
hr = result.pdispVal->QueryInterface(IID_IDispatch, reinterpret_cast<LPVOID*>(&pPromo));
VariantClear(&result);

现在我试着阅读属性Foobar of IPositionPromotion

代码语言:javascript
代码运行次数:0
运行
复制
OLECHAR* strFoobar = L"Foobar";
DISPID dispIDFoobar = -1;
hr = pPromo->GetIDsOfNames(IID_NULL, &strFoobar, 1, LOCALE_SYSTEM_DEFAULT, &dispIDFoobar);

不幸的是,最后一次调用在DISP_E_UNKNOWNNAME中失败了。

是否有人成功地从VB6 (或C#)调用了C++接口成员?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-29 20:46:38

VB6使用显式接口实现。实现接口的方法不会成为实现对象的公共接口的一部分,为了调用它们,您需要显式地请求接口。如果您愿意,稍后可以将IDispatch从该接口中请求出来,但是您需要首先查询接口,因为您从对象本身获得的IDispatch和从该对象实现的接口获得的IDispatch将是不同的IDispatches。

所以当你有:

代码语言:javascript
代码运行次数:0
运行
复制
' IInterface.cls
Public Sub Method()
End Sub
代码语言:javascript
代码运行次数:0
运行
复制
' Class1.cls
Implements IInterface

Private Sub IInterface_Method()
  MsgBox "!"
End Sub

如果您想要创建一个Class1实例并调用Method(),下面的内容将无法工作:

代码语言:javascript
代码运行次数:0
运行
复制
' Complile-time error: method not found
Dim c As Class1
Set c = New Class1

c.Method
代码语言:javascript
代码运行次数:0
运行
复制
' Run-time error: Object does not support this property or method
Dim c As Object    ' IDispatch
Set c = New Class1 ' QueryInterface for IDispatch from Class1

c.Method

以下内容将发挥作用:

代码语言:javascript
代码运行次数:0
运行
复制
Dim c As IInterface
Set c = New Class1

c.Method  ' Early binding
代码语言:javascript
代码运行次数:0
运行
复制
Dim c As IInterface
Set c = New Class1

Dim c_as_idispatch As Object   ' IDispatch
Set c_as_idispatch = c         ' QueryInterface for IDispatch from IInterface

c.Method  ' Late binding

您的C++代码与上面的第二个不工作示例相同。

要修复它,首先使用QueryInterface表示IPositionPromotion,然后查询IDispatch

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38643791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档