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

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

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

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

考虑到以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
运行
AI代码解释
复制
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 12:46:38

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

所以当你有:

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

Private Sub IInterface_Method()
  MsgBox "!"
End Sub

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

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

c.Method
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
' 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
运行
AI代码解释
复制
Dim c As IInterface
Set c = New Class1

c.Method  ' Early binding
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

复制
相关文章
PHP后期静态绑定
即在类的继承过程中,使用的类不再是继承的类.而是调用的类,通过static关键字来实现,"static"不在被解析定义为当前方法所在的类,而是在实际运行时计算得到的,即为运行时最初调用的类,虽然称为后期静态绑定 但是并不局限于静态方法的调用
憧憬博客
2020/07/20
9500
3-AIII--Service绑定服务基于接口调用方法
零、前言 1.上篇中MyBinder暴漏在外,亲自上阵,执行方法。Binder是连接者,能不出面尽量不出面,一个"电话(接口)"搞定的事就不要让他老人家(MyBinder)亲自跑一趟。面向接口,隐藏
张风捷特烈
2018/09/26
6570
VB6对滚轮的支持
        我需要对Mapx控件支持鼠标滚轮,找了一个可以使用的代码,来自         http://blog.csdn.net/areful/archive/2007/10/19/1832010.aspx         需要注意的是,在FormLoad中增加Hook Map1.hWnd,在Form_Unload中增加UnHook Map1.hWnd         另外,在鼠标移动经过Map时,可以激发Map的mousemove事件,但滚轮无效,因为焦点不在Map上,可以用Map1.SetF
用户1075292
2018/01/23
1K0
[android] 绑定方式开启服务&调用服务的方法
我们调用api开启服务,这是系统new出来的,我们没有得到SingService对象,因此没法调方法
唯一Chat
2019/09/10
8590
[android] 绑定方式开启服务&调用服务的方法
后期静态绑定在PHP中的使用
什么叫后期静态绑定呢?其实我们在之前的文章PHP中的static中已经说过这个东西了。今天我们还是再次深入的理解一下这个概念。
硬核项目经理
2020/03/26
7120
Django | 如何优雅的在某接口对其他接口的调用
开发中遇到的某个实际场景,在 django 中新增加一个 API 接口, 该接口部分的功能需要用到另一个接口的返回数据。
Python编程与实战
2020/04/14
3.5K0
Django | 如何优雅的在某接口对其他接口的调用
VB6 调用Excel,并进行操作
excelsheet.Application.Visible = True
办公魔盒
2019/07/22
2.7K0
VB6 调用Excel,并进行操作
应用性能监控接口调用问题 接口调用优化方法
现在很多软件都会使用应用性能监控,希望可以试试监控软件的性能情况,以便做出优化方案。而在应用性能监控系统中有很多数据,其中也包括接口调用的情况。而接口调用就是指某个子服务系统去调用其他系统。在这个过程中,可能会出现一些问题。大家有疑问的话,可以了解下面的应用性能监控接口调用问题和解决方案。
用户8715145
2022/03/23
1.1K0
php面对对象之后期绑定
自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。
仙士可
2019/12/18
4970
java调用webservice接口的几种方法
前几天看到群里有人问webservice,稍微总结一下! webservice的 发布一般都是使用WSDL(web service descriptive language)文件的样式来发布的,在WSDL文件里面,包含这个webservice暴露在外面可供使用的接口。今天搜索到了非常好的 webservice provider列表 http://www.webservicex.net/WCF/default.aspx 这上面列出了70多个包括很多方面的free webservice provider,uti
三哥
2018/06/15
38.5K1
java 多态 向上转型 后期绑定一例
switch中的 default 语句不管放在哪个位置,都是在所有case都不满足的情况下最后执行。 foreach语句 for(元素类型 元素变量;遍历对像) 变量元素.draw()即 遍历对象.draw();foreach即for每一个。 for (Shap shp: s) shp.draw(); 个人理解,当 s[0]=gen.next();时 调用RandomShapeGenerator 中的next方法,执行语句case0-2其中一个return语句得到指向Circle Square Triangle 其中的一个引用,并将其以Shape类型发送出去。此例中当return语句指向Circle时 shp.draw() 即将shp元素变量替换为Circle对象,调用Shap类型 Circle对象draw 方法。 package javahaonan.shape; public class Shape { public void draw() {} public void erase() {} } package javahaonan.shape; import static javahaonan.Print.*; public class Circle extends Shape { public void draw() { print ("Circle。draw()");} public void erase() {print ("Cricle.erase()");} } package javahaonan.shape; import static javahaonan.Print.*; public class Square extends Shape { public void draw(){print("Square.draw()");} public void erase(){print("Square.erase()");} } package javahaonan.shape; import static javahaonan.Print.*; public class Triangle extends Shape { public void draw(){print("Trinagle.draw()");} public void erase(){print("Trinagle.erase()");} } package javahaonan.shape; import java.util.*; public class RandomShapeGenerator { private Random rand = new Random(); public Shape next(){ switch(rand.nextInt(3)){ default: case 0:return new Circle(); case 1:return new Square(); case 2:return new Triangle(); } } } package javahaonan.shape; public class Shapes { private static RandomShapeGenerator gen = new RandomShapeGenerator(); public static void main(String[] args) { Shape[] s=new Shape[9]; for (int i=0;i s[i]=gen.next(); for(Shape shp: s) shp.draw(); } }/output* Square.draw() Trinagle.draw() Square.draw() Circle。draw() Square.draw() Trinagle.draw() Trinagle.draw() Trinagle.draw() Trinagle.draw() */
葫芦
2019/05/09
5530
金税盘组件接口调用方法
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/131669.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/12
4890
小程序---调用后端接口的方法
学习小程序一段时间了,写页面对我来说没有任何问题。最近学习如何请求后端接口,本来想请求项目中正在用的接口,可是无缘,微信小程序不允许。官方给出的提示是,接口必须有域名且备案,我就无语了,我们的接口都是ip地址,所以我只能呵呵了。不过,也没太大关系,重点是学习方法。下面,我简单说一下官方给出的请求接口的方法。
半指温柔乐
2019/03/29
3.2K0
[亲测可用]springBoot调用对方webService接口的几种方法示例
平常我们开发调用接口一般会用到几种数据格式,比如有restful的,这个是目前最流行的,也是最简单开发的,还有一种就是webservice数据格式,这个应该是很久以前的一些项目是用的这种
小小鱼儿小小林
2020/06/29
14K0
通过策略模式提供通用的http接口调用方法
在微服务中,服务可能是部署和运行在不同的区域的。 不同区域的服务,认证方式也不同,接口调用方式不同。
Antony
2020/12/02
1.1K0
点击加载更多

相似问题

vb6 excel后期绑定

14

接口常量,后期静态绑定

14

VB.NET接口/后期绑定

16

使用接口可能的后期绑定技术

10

C#中的接口与后期绑定

42
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文