对VB6接口方法的后期绑定调用
Late-bound call to VB6 interface methods
在我的C++程序中,我使用了一个在VB6 COM DLL中实现的COM类。让我们把这个类称为CETicketRA
。此类具有类型为IPositionPromotion
的属性AppliedPromotion
。IPositionPromotion
是由相同的VB6 COM DLL定义的接口。它有各种各样的属性和方法,我试图从C++访问这些属性和方法。
给定以下代码:
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);
现在我尝试读取IPositionPromotion
:的属性Foobar
OLECHAR* strFoobar = L"Foobar";
DISPID dispIDFoobar = -1;
hr = pPromo->GetIDsOfNames(IID_NULL, &strFoobar, 1, LOCALE_SYSTEM_DEFAULT, &dispIDFoobar);
不幸的是,最后一次调用DISP_E_UNKNOWNNAME
失败。
是否有人成功地从C++(或C#)调用了VB6接口成员?
VB6使用显式接口实现。实现接口的方法不会成为实现对象公共接口的一部分,为了调用它们,您需要显式地请求接口。如果你愿意,你可以稍后要求IDispatch
退出该接口,但你需要先查询接口,因为你从对象本身得到的IDispatch
和你从该对象实现的接口得到的IDispatch
将是不同的IDispatch
es
所以当你有:
' IInterface.cls
Public Sub Method()
End Sub
' Class1.cls
Implements IInterface
Private Sub IInterface_Method()
MsgBox "!"
End Sub
如果您想创建Class1
的实例并调用Method()
,则以下操作将不起作用:
' Complile-time error: method not found
Dim c As Class1
Set c = New Class1
c.Method
' 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
以下内容将起作用:
Dim c As IInterface
Set c = New Class1
c.Method ' Early binding
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
。
相关文章:
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 努力将指向成员函数的指针绑定到类模板的T成员,然后在槽中调用
- 使用 Node.js 调用child_process与从 C 调用子进程并创建C++绑定以从 node.js 调用
- C++ 如何绑定和调用模板化类型方法
- std::tie 在从函数调用传递值时失败,并显示"无法绑定非常量左值引用"
- C++ 方法调用 (lvalue) 绑定到派生类中的函数 (rvalue),而不是基类中的函数 (lvalue)
- 仅在使用间接寻址时调用虚函数 — 经典的早期绑定问题?
- 当不处理指针时,请调用子类(虚拟)函数(较晚绑定)
- 使用函数内部绑定调用
- 为什么不允许将右值引用绑定到非常数引用,而允许在其中一个上调用非常数成员函数
- 使用boost数字绑定和对gesvd的lapack调用时出错
- 为什么在调用 glDrawArray 之前不需要绑定顶点缓冲区对象?
- 使用后期绑定从非私有上下文调用私有方法
- 缺少对指向成员函数的绑定指针的调用
- C++ Boost::bind:指向绑定函数的指针只能用于调用该函数
- 如何使用延迟绑定调用本机C库
- 观察c++中虚函数在汇编器中的后期绑定调用
- 如何从精神语义规则绑定/调用存储在fusion::vector中的boost::函数
- 对VB6接口方法的后期绑定调用
- C++ - std::绑定调用运算符()与完美的转发