• 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 > com中函数的参数可以传递结构体吗?

com中函数的参数可以传递结构体吗?

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

佚名通过本文主要向大家介绍了com函数,com库函数,结构体指针做函数参数,结构体数组做函数参数,结构体作为函数参数等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: com中函数的参数可以传递结构体吗?
描述:

客户端:
struct  dom
    {
    double d;
    double d2;
    };
struct dom sum1;
sum1.d1=1;
sum1.d2=2;
f(sum)
服务端:com组件函数
STDMETHODIMP Cpo6::f( dom  sum2)
{输出sum2的d1,d2的值}
这边出错了,sum的值没有传过来,
为什么呀??????
要怎样才能传递结构体呀?????


解决方案1:

DCOM:
struct  dom
    {
    double d;
    double d2;
    
STDMETHODIMP Cpo6::f( struct dom  sum2)
即可

解决方案2:

在COM方法中传递结构类型
(作者:王廷正)
在RPC的应用里,经常在接口方法中使用结构类型,COM的方法中也可以传递结构类型。就用一个实验简单测试一下在COM方法中传递结构类型。
用ATL向导建立一个名字为structsmp的工程,加入一个简单对象MyTest继承接口名为ITestStruct。.
在工程中加入一个文件mytypes.idl,在里面定义一个结构UserInfo如下:
typedef struct
{
    long no; 
    unsigned char name[255];
    BSTR address;
}UserInfo;
在structsmp.idl的文件头部加入import “mytypes.idl”
1. 加入第一个方法GetUserInfo
    HRESULT GetUserInfo([out,retval] UserInfo *pUserInfo);
方法的实现如下:
STDMETHODIMP CMyTest::GetUserInfo(UserInfo *pUserInfo)
{
    pUserInfo->no=100;
    memcpy(pUserInfo->name,"Mona Lisa",10);
    pUserInfo->address=SysAllocString(L"Italy");
    return S_OK;
}
下面用VB程序作为客户端来测试这个方法:
新建一个VB的工程,引用此组件。定义组件对象:
    Dim obj As New STRUCTSMPLib.MyTest
下面调用方法如下:
Dim ui As userinfo
ui = obj.GetUserInfo()
MsgBox ui.no
MsgBox StrConv(ui.Name, vbUnicode)
MsgBox ui.address
运行的结果符合了我们的期望,这个实验已经踏出坚实的第一步了。
2.下面在组件里添加第二个方法:
    HRESULT SetUserInfo([in] UserInfo *pUserInfo);
STDMETHODIMP CMyTest::SetUserInfo(UserInfo *pUserInfo)
{
    USES_CONVERSION;
    char info[255];
    WriteLog("begin SetUserInfo function");
    sprintf(info,"pUserInfo->no is:%d,pUserInfo->name is:%s,pUserInfo->address is:%s",pUserInfo->no,pUserInfo->name,OLE2T(pUserInfo->address));
    WriteLog(info);
    return S_OK;
}
WriteLog函数是一个把信息写进文件的函数。
在VB的客户程序里:
Dim ui As userinfo
ui.no = 101
ui.Name(0) = Asc("h")
ui.Name(1) = Asc("e")
ui.Name(2) = Asc("l")
ui.Name(3) = Asc("l")
ui.Name(4) = Asc("o")
ui.address = "world"
obj.SetUserInfo ui
查看最终的结果,又是正确的,这次的结果让人信心倍增。
3.从现在来看对单个结构在接口方法里传递没有任何的问题,下面就是该考虑结构数组的时候了,一口气添加两个方法,请看:
在接口里添加两个方法,传递结构数组,并且在方法的实现里写上测试的代码。
    HRESULT SetUserInfoArray([in] long cMax,[in,size_is(cMax)] UserInfo *pUserInfo);
    HRESULT GetUserInfoArray([in] long cMax,[out,size_is(cMax)] UserInfo *pUserInfo);
STDMETHODIMP CMyTest::SetUserInfoArray(long cMax, UserInfo *pUserInfo)
{
    USES_CONVERSION;
    char info[255];
    WriteLog("begin SetUserInfoArray function");
    for(int i=0;i<cMax;i++)
    {
        sprintf(info,"%d:pUserInfo->no is:%d,pUserInfo->name is:%s,pUserInfo->address is:%s",i+1,pUserInfo->no,pUserInfo->name,OLE2T(pUserInfo->address));
        WriteLog(info);
        pUserInfo++;
    }
    return S_OK;
}
STDMETHODIMP CMyTest::GetUserInfoArray(long cMax, UserInfo *pUserInfo)
{
    for(int i=0;i<cMax;i++)
    {
        pUserInfo->no=100;
        memcpy(pUserInfo->name,"Mona Lisa",10);
        pUserInfo->address=SysAllocString(L"Italy");
        pUserInfo++;
    }
    return S_OK;
}
现在在VB的客户程序里加上测试这两个方法的代码:
Dim ui(9) As userinfo
obj.GetUserInfoArray 10, ui(0)
For i = 0 To 9
Debug.Print ui(i).no
Debug.Print StrConv(ui(i).Name, vbUnicode)
Debug.Print ui(i).address
Next
和
Dim ui(9) As userinfo
For i = 0 To 9
ui(i).no = 101
ui(i).Name(0) = Asc("h")
ui(i).Name(1) = Asc("e")
ui(i).Name(2) = Asc("l")
ui(i).Name(3) = Asc("l")
ui(i).Name(4) = Asc("o")
ui(i).address = "world"
Next
obj.SetUserInfoArray 10, ui(0)
ACTION的结果可以说让我们欣喜若狂,结构类型在接口里畅通无阻。
4.远程调用
狂喜过后我们又要进行下一步的实验,这一次针对的是结构类型的方法在远程调用中的特性。在这里我们使用系统提供的代理dllhost.exe和标准调度,客户程序是一个控制台程序。这一次结构类型又不负众望顺利过关,表现的非常完美。到此实验就OVER了,以后可以放心大胆的在COM的方法里使用结构类型啦。


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

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

  • 求com中限制同一函数在同一时间只有一个在执行的方法
  • 一个在COM中,函数名重复的问题如何解决?
  • 关于COM添加的函数的传入的参数的疑问
  • COM函数库开发文档的问题
  • com中使用智能指针调用函数时,为什么可以不传最后一个参数?
  • COM里只执行一次的函数
  • COM构造函数可以传递参数进去吗?
  • 一个COM函数的调用问题
  • com函数中参数传出[out]到底是怎么回事
  • com函数中用什么类型传递时间参数

相关文章

  • 2017-06-04 如何写idl才能达到mssoap30dll的效果
  • 2017-06-04 COM原理与应用中第五章的例子Mfc实现的COM加了两个BEGIN_INTERFACE_PART后出现问题???
  • 2017-06-04 上网时ACTIVEX控件显示不出来
  • 2017-06-04 在哪儿可找到COM规范?急求!有重赏
  • 2017-06-04 IE+plugin+SDKReader+plugin+SDK
  • 2017-06-05 VC如何关闭重启过程中由另一程序弹出的确认对话框(messagebox)
  • 2017-06-04 利用智能指针的方法InvokeN,如何返回多个值?
  • 2017-06-04 请问一个关于IConnectionPointContainer实现的问题
  • 2017-06-04 刚学COM,请推荐一些能够Download有关COM学习的书的网址这里先谢了!!!
  • 2017-06-05 怎样在dll中定义全局变量?

文章分类

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

最近更新的内容

    • 求救!在Win2k,和xp中隐藏进程的问题
    • 自己写的IE的Toolbar,怎样在注册后直接显示在IE上,而不用在工具栏里选择?
    • 关于MSChart控件调用
    • 为什么MFC程序可以只支持ActiveX而不支持Automation?
    • docxlspptdwghtml全文检索
    • mfcListcrol
    • 使用atl开发ActiveX控件,如何弹出模态对话框
    • 在编写一个clock控件时候出现的问题,怎么画不了图。。。
    • 我想在我的MFCDoc/View程序的View里面加入一个Word编辑对象
    • Rapi调用(阻塞线程问题)

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

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