• 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接口定义,usb转com接口驱动,com接口,com扩展接口等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 关于在COM的事件接口中自定义结构的传递问题
描述:

我定义了一个COM接口IXManageInfoBase,并有对应的事件接口DXManageInfoBaseEvents


interface IXManageInfoBase : IUnknown{
typedef struct _CLIENT_INFO{
DWORD dwIpAddr;
USHORT usPort;
[string] wchar_t* pwszMAC;
[string] wchar_t* pwszComputerName;
}CLIENT_INFO;
[, helpstring("method GetXXXX")] HRESULT GetXXXX([in] CLIENT_INFO* pClient);
};
library sdcsrvmLib
{
        ......
dispinterface DXManageInfoBaseEvents
{
properties:
methods:
[id(1), helpstring("method OnClientChanged")] HRESULT OnClientChanged([in] CLIENT_INFO* pclient);
};
        .......
coclass XManageInfoBase
{
[default] interface IXManageInfoBase;
[default, source] dispinterface DXManageInfoBaseEvents;
};
};

GetXXXX和OnClientChanged的函数参数类型都是CLIENT_INFO*
GetXXXX函数调用正常,
但事件接口中的OnClientChanged函数中使用CLIENT_INFO*时碰到几个问题:
1, 以下代码是MFC自动为事件接口对象生成的代码,但在编译的时候,编译器警告说会把avarParams[0] = pclient;强制转为BOOL型
2.  我把代码改为如下: avarParams[0] = (BYTE*)pclient;  编译没有警告了,但在客户端被传递过去的只是一个字节
请问我该如何修改才能把CLIENT_INFO的完整结构传递过去?

#pragma once
template<class T>
class CProxyDXManageInfoBaseEvents :
public IConnectionPointImpl<T, &__uuidof(DXManageInfoBaseEvents)>
{
public:
HRESULT Fire_OnClientChanged( SDC_EVENT_ACTION sea,  SDC_CLIENT_INFO * pclient)
{
HRESULT hr = S_OK;
T * pThis = static_cast<T *>(this);
int cConnections = m_vec.GetSize();
for (int iConnection = 0; iConnection < cConnections; iConnection++)
{
pThis->Lock();
CComPtr<IUnknown> punkConnection = m_vec.GetAt(iConnection);
pThis->Unlock();
IDispatch * pConnection = static_cast<IDispatch *>(punkConnection.p);
if (pConnection)
{
CComVariant avarParams[2];
avarParams[1] = sea;
avarParams[0] = pclient;
CComVariant varResult;
DISPPARAMS params = { avarParams, NULL, 2, 0 };
hr = pConnection->Invoke(1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &params, &varResult, NULL, NULL);
}
}
return hr;
}
};


解决方案1:

CLIENT_INFO最好是IDispatch接口的派生类, 举例:
class CLIENT_INFO : public IDispatch
{
};
传递时,
CLIENT_INFO ci;
VARIANT var;
var.vt = VT_DISPATCH;
var.pdispVal= &ci;
接口定义:
[id(1), helpstring("method OnClientChanged")] HRESULT OnClientChanged([in] VARIANT* pclient);
用非标准的COM接口作参数只能产生未遇料到的错误 .

解决方案2:

问题在avarParams[0] = pclient;这句,可以跟踪看看如果编译通过,构造出来的VARIANT是哪种变量类型。
由于你传递的指针是用户类型指针,当连接点客户端被调用时,VARIANT参数没有正确地转换成你需要的指针类型,后果是难以预料的。


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

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

  • 请问,COM接口是否可以传递自己定义的结构?
  • 如何在COM接口中把自定义的类型传递出来使用?
  • COM定义接口的问题
  • com中指针定义
  • com接口传递自定义结构体数组。
  • 如何在com接口方法中传递自定义参数,如枚举
  • 怎样让COM接口返回自己定义的信息?
  • 在com+中如何在各层之间传递自定义数据
  • COM接口的定义(奇怪的错误,请高手指点)
  • COM的接口一般要定义两次,这样为什么不会造做成重定义?

相关文章

  • 2017-06-05 请教高手:能否通过AfxBeingThread传入的handle参数直接访问主线程成员?
  • 2017-06-04 有关ActiveMovivecontrol控件的问题
  • 2017-06-04 MFCmediaplayer全屏的时候产生控制面板问题
  • 2017-06-04 高分:用VC开发Word插件,连接数据库失败后Word自动关闭
  • 2017-06-05 CMSComm
  • 2017-06-04 我想在组件中使用自定义的结构,请问怎么定义在何处定义?详情请入内!
  • 2017-06-04 开发一个用ATL,SOCKET,THREAD,HTTP这些技术的COM组件,有兴趣,请进
  • 2017-06-05 关于mscomm控件缓冲区的问题
  • 2017-06-04 本机COM转成DCOM,需要做注册表修改工作有哪些???
  • 2017-06-04 UpdateData所在头文件

文章分类

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

最近更新的内容

    • ATL中使用自定义数据类型作为参数!!!测试的时候报错!
    • editcontrol输入中文乱码问题
    • InternetExplorerToolbarDeskbandTutorial为什么无法编译?
    • 今天看见我的崇拜对象pam(潘爱民)的贴子,分外兴奋,决定义诊,送分回答十个COM问题,有问题就问吧。
    • 我写了COM服务器在写接口时我要调用以前写的好的静态DLL请问我怎么调用呀
    • 请高手指教一个错误
    • ATL开发activex中如何实现类型Font属性的自定义属性?
    • 关于调用word的表格的问题
    • ActiveX控件方法onload事件中调用时出错
    • VCNet对话框项目右键找不到我的控件

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

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