• 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 > 关于VC采用Invoke方法调用双接口的函数时传递多个参数的问题

关于VC采用Invoke方法调用双接口的函数时传递多个参数的问题

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

佚名通过本文主要向大家介绍了 关于VC采用Invoke方法调用双接口的函数时传递多个参数的问题等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 关于 VC采用Invoke方法调用双接口的函数时传递多个参数的问题
描述:

虽然VC用GetIDsOfNames,Invoke方法有点多事但是对学习COM还是有用的.我只见到过传递一个参数的例子,因此根着感觉写了传两个参数的"BUG"代码:
下列代码中,假设接口的指针ptrILeaf已获取。
如果有vtbl方式调用如下
_bstr_t bstr1("参一"), bstr2("参二");
_bstr_t ret;    // 存储返回值
ret = ptrILeaf -> Done(bstr1,bstr2);
将正确的得到ret = 参一参二; (也就是返回bstr1 与 bstr2 的和)
但下面用Invoke方法缺得到 ret = 参二参二 , 没有把参数一的值传进去
似乎执行的是 ret = ptrILeaf -> Done(bstr2,bstr2); 这是为什么?
以下的注释是我对个部分代码的理解,可能我的理解有错误请哥哥姐姐们指正。
               
                                                  谢谢  !!!!
void CTstFlowerDlg::OnButtonInvoke() 
{
wchar_t *name = L"Done"; // 存储待查询函数的名字
 //--------------- 调用GetIDsOfNames()函数得到DispID --------------------
DISPID dispID; // 存储待查询函数的DispID
ptrILeaf->GetIDsOfNames(IID_NULL, // 必须为IID_NULL
      &name   , // 一个指向 存储函数名的指针 的指针
       1       ,// 函数名的个数
                        GetUserDefaultLCID(), 
      &dispID // 返回待查函数的DispID
               );
    
 //---------------- 用Invoke()执行对应DispID 的函数 ---------------------
   VARIANT ret;      // 存贮返回值
   VariantInit(&ret); // 初始化VARIANT类型的变量
   ret.vt = VT_BSTR;  // 指明要存贮的返回值得类型为BSTR
   VARIANT var[2];
   // 初始化VARIANT类型的变量
   ::VariantInit(&var[0]); 
   ::VariantInit(&var[1]);
   // 指明var[0],var[1]将存贮BSTR类型的变量
   var[0].vt=VT_BSTR;       
   var[1].vt=VT_BSTR;
   // 按BSTR类型的方式给数组元素赋值
   var[0].bstrVal = _bstr_t("A"); 
   var[1].bstrVal = _bstr_t("B");
 // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
   DISPPARAMS param;                 // 存储被调函数的参数
   param.cNamedArgs = 0;             //永远为0
   param.rgdispidNamedArgs = NULL;   //永远为NULL
   
   param.rgvarg = var;               // 用以存储被调函数参数表数组的首地址(VARIANT类型的数组)
   param.cArgs =   2 ;               // 参数表数组的元素个数
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 
ptrILeaf->Invoke(dispID, // 被调用函数的DispID
        IID_NULL, // 必须为IID_NULL
                 GetUserDefaultLCID(),                          
                 DISPATCH_METHOD, // 调用方式
        &param,          // 存储被调函数的参数的标准结构的地址
                 &ret,            // 存贮被调函数的返回值得VARIANT型指针
        NULL,
        NULL          );
   
}


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

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

相关文章

  • 2017-06-05 如何将一个exe工程改成ocx
  • 2017-06-05 在Win9x下,没有CreateRemoteThread和VirtualAllocEx函数,但如何用CreateKernelThread和Alloc函数代替
  • 2017-06-05 关于销毁一个窗口后,内存使用量依然保持不变的MFC问题
  • 2017-06-05 用LoadLibrary和GetProcAddress函数调用dll的代码有问题,希望高手指点(谢谢)!
  • 2017-06-04 VT_INT_PTR在VC6环境下说未定义
  • 2017-06-04 奇怪的问题,ATL开发COM组件时如何产生随机数,用rand在Release模式下出错
  • 2017-06-04 高分请教高手(COM组件问题)
  • 2017-06-04 COleDataSource::DoDragDrop符号无法解析问题(紧急求助)
  • 2017-06-04 如何实现:插件安装后自动在IE的工具栏显示?
  • 2017-06-04 高分:如何在ie中实现msntoolbar或者yahootoolbar的tabbedbrowsing选项卡式浏览

文章分类

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

最近更新的内容

    • 为什么两个线程中的对话框会相互影响
    • 输入节挂接api中的GetProcAddress问题
    • 怎么在ActiveX写回调函数
    • 关于ocx的版本的问题求助??
    • 对MultiMediaTimer不熟,有两个问题?
    • 为什么用向导生成的ATLCOM工程(dll)没有dlldatac文件
    • 高手帮忙:关于线程的问题!急急急
    • 求教:PDH里调用PdhEnumObjectItems出错的问题
    • IE编程的问题,送分!
    • 如果遍历IIS中指定端口下的所有目录,虚拟目录,文件?

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

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