• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > IDispatch::Invokemethod参数调用问题

IDispatch::Invokemethod参数调用问题

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了idispatch,idispatch error 3092,idispatch error 3149,idispatch error 3088,idispatch error 3127等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: IDispatch::Invoke method参数调用问题
描述:

对IDispatch::Invoke method 不熟悉,照着MSDN上的说明写了这样的调用,无法得到我想要的东西,恳请各位高手指点,在此谢过!!
我想取出IDL文件中Iocls接口下的方法“SI2”的方法的返回值:
SI2 方法定义:
SI2(SHORT BVI2, SHORT* BRI2, SHORT* pVal)
Invoke方法:
......
hr = cls1->QueryInterface(IID_IDispatch, (LPVOID*)&obj);  //cls1为指向接口Iocls的指针 
DISPPARAMS params;
params.cArgs = 3;
params.cNamedArgs = 3;
if(SUCCEEDED(hr))
{
//因为SI2有三个参数。。 
params.rgvarg = new VARIANT[params.cArgs];
params.rgvarg[0].vt = VT_I2 | VT_BYREF;
params.rgvarg[0].llVal = 0;
params.rgvarg[0].vt = VT_I2 | VT_BYREF;
params.rgvarg[0].llVal = 5;
params.rgvarg[1].vt = VT_I2;
params.rgvarg[1].llVal = 5;
VARIANT shortVal;
VariantInit(&shortVal);
DISPID dispid;
OLECHAR FAR* szMember = L"SI2";
hr = obj->GetIDsOfNames(IID_NULL, &szMember, 1, LOCALE_SYSTEM_DEFAULT, &dispid); //hr = S_OK;
hr = obj->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &params, &shortVal, NULL, NULL); //hr = 0x8002000e Invalid number of parameters. 
}
......
请问各位: Invoke参数哪儿处理的不对?


解决方案1:

应该只有两个参数,返回值是通过Invoke的pVarResult来接收的

解决方案2:

params.cNamedArgs = 3;
把3换成0或者1试试,具体含义我忘记了,楼主也可以查一下。

解决方案3:

params.rgvarg[0].vt = VT_I2 | VT_BYREF;
params.rgvarg[0].llVal = 0;
params.rgvarg[1].vt = VT_I2 | VT_BYREF;
params.rgvarg[1].llVal = 5;
params.rgvarg[2].vt = VT_I2;
params.rgvarg[2].llVal = 5;

这样

解决方案4:

params.rgvarg[0].vt = VT_I2 | VT_BYREF;
params.rgvarg[0].llVal = 0;
params.rgvarg[0].vt = VT_I2 | VT_BYREF;
params.rgvarg[0].llVal = 5;
params.rgvarg[1].vt = VT_I2;
params.rgvarg[1].llVal = 5;

三个参数,params.rgvarg的下标应该是从[0]到[2],而不是只有[0]和[1]。


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 实现了IDispatch接口的组件和ActiveX控件用起来有什么不同呢?我觉得一样可以用在Web页面上,为什么ActiveX控件还要多实现那么多各种各样
  • 实现了IDispatch接口的组建,用vbscript怎么调用?
  • IDispatch::Invoke如何通过dispid调用方法?
  • 关于idispatch和typelib
  • 问个弱弱的问题:得到一个ActiveX控件的IDispatch指针后,如何使用?有没有与CListCtrl相同的ActiveX控件?
  • MSFlexGrid有一个Picture属性,是一个IDispatch接口指针,请问如何操作?
  • 请教COM,IDispatch相关问题!
  • 制作弹出广告拦截器时碰到问题,关于OnNewWindow2IDispatchppDisp,BOOLCancel的
  • [关于IDispatch问题]:如何将tlb文件编译进dll中?高分求救
  • 请问一下:COM组件(TLB)中使用IDispatch和CoInitialize两种方法有何不同?谢谢啦

相关文章

  • 2017-06-04 COMCOM++和Webservice将来谁的生命力强?
  • 2017-06-04 ActiveX和C#的类型转换问题
  • 2017-06-05 如何屏蔽win健和alt键?高手指点
  • 2017-06-04 有没有人开发过基于微软NetMeetingCOM的网络会议控件?
  • 2017-06-05 请问如何获得进程已经执行的时间???
  • 2017-06-05 关于线程的问题,为什么会这样???????????
  • 2017-06-04 如何解决ActiveX注册时出现错误警告?
  • 2017-06-05 请问:利用SMTP协议发送邮件后,如何通过pop协议收取特定的邮件?
  • 2017-06-05 vc开发的dll中,怎样导入gif图片文件,才能在IE中使用file://c:\MyDlldll/agif方式查看
  • 2017-06-05 Hook如何给当前程序发送一个按钮消息

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 这样来判断一个文件是否在使用有错么
    • MFC中调用ocx提交类型不匹配,求救
    • 初学ActiveX,问几个问题,希望得到一条明路
    • 求教:Vc中调用com组件问题
    • 学COM用什么书
    • 线程参数传递问题
    • 如何实现ftp拖动下载??
    • CreateProcess
    • VC如何使用cmd这种编译脚本
    • 迷茫中:如何得到OLE组件的数据?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有