• 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事件接口函数返回自定义的类型struct

怎样让COM事件接口函数返回自定义的类型struct

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

佚名通过本文主要向大家介绍了struct,typedef struct,struct用法,typedef struct用法,c struct等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 怎样让COM事件接口函数返回自定义的类型struct
描述:

我在COM事件接口函数中要返回一个自定义的结构体让调用程序进行处理
但是编译的时候出现了如下的Warning:
warning C4800:...my_struct forcing value to bool 'true' or 'false'
为何会出现强制类型转换?
不知道这样在外部调用时能否得到正确的值?
如果不能,事件接口函数的参数应当怎样设?
该函数如下:
HRESULT Fire_OnGetTrap(MY_STRUCT * pMyStruct)
{
CComVariant varResult;
T* pT = static_cast<T*>(this);
int nConnectionIndex;
CComVariant* pvars = new CComVariant[1];
int nConnections = m_vec.GetSize();
for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++)
{
pT->Lock();
CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex);
pT->Unlock();
IDispatch* pDispatch = reinterpret_cast<IDispatch*>(sp.p);
if (pDispatch != NULL)
{
VariantClear(&varResult);
pvars[0] = pMyStruct;
DISPPARAMS disp = { pvars, NULL, 1, 0 };
pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL);
}
}
delete[] pvars;
return varResult.scode;
}


解决方案1:

HRESULT Fire_OnGetTrap(MY_STRUCT * pMyStruct)放在com的源代码中,你需要触发该事件的地方就ok了。很难吗?

解决方案2:

我没用过事件,但是我可以用定制自己的结构体类型,并且实现VB到VC的跨语言传送。
方法为:
建立一个ATL的工程名位DefStruct
然后在idl文件中下面语句的后加入自己定义的类型
其中UUID自己通过Windows提供的生成器生成
library VCNETWORKLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
         //此处向下为自己定义的结构
//定义一个结点结构体
typedef
[
uuid(D124B04A-C5F9-4a16-9671-1E67B75DB1DB),
helpstring("NetWork Node Struct")
]
struct NODE
{
double dx;
double dy;
long lptNo;
}NODE;
这样子就定义了一个NODE的结点类型
从原理分析这种定义方法也用在事件的参数传递应该没有问题,我没有具体试过,楼主可以尝试一下

解决方案3:

参数必须是com规定的那几种吧,要不然怎么实现跨语言跨进程,自定义的东西可以用指针啊,转换2次就ok。


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

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

  • 如何改变Composite控件的背景色?
  • IDispacth::Invoke方法无法传递STRUCT参数的问题?请真正的高手帮帮忙。
  • 这个typedef是做什么的?
  • typedefvector<long>VTYPE_NODE_P
  • struct里面若有com指针要如何初始化
  • 如何调用参数是structRangeRange的函数
  • 在ATL的类声明当中的DECLARE_PROTECT_FINAL_CONSTRUCT是个必须存在东西么?还是可选的?
  • 为什么要重载ATL类的FinalConstruct?在这个函数里面我们通常做什么事情?
  • CString到底是MFC的类型还是ATL的类型?为什么有_ATL_CSTRING_EXPLICIT_CONSTRUCTORS这个宏?
  • 类型库struct对齐方式问题

相关文章

  • 2017-06-04 vc如何使用自定义的ocx
  • 2017-06-04 如何用IStream传递一个较大的文件?如何Mashaling该stream?
  • 2017-06-05 请帮忙进来看看,谢谢!
  • 2017-06-04 comDLL和普通DLL相比有哪些牛BT的地方?
  • 2017-06-05 请问怎样在动态库中实现多线程?
  • 2017-06-04 MFC开发ActiveX问题
  • 2017-06-05 进程出现未响应的状态码是什么,或如何检测进程出现未响应了。。。。
  • 2017-06-04 实现IcontextMenu的comshell扩展怎么替换弹出菜单?
  • 2017-06-05 如果是一个对话框里要设两个MSComm控件,那DECLARE_EVENTSINK_MAP该怎么办呢?
  • 2017-06-04 如何通过插件方式取到office模板文件的全路径???

文章分类

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

最近更新的内容

    • VC调用WORD里面函数,写表格时出错,不明白咋回事
    • ATL做的COM组件,Service类型的,但是我把她运行起来后她总是自动退出,怎么办啊?
    • VC操作Excel,怎么才能让“是否保存对文件的修改?”这样的对话框弹出?
    • 这儿有多少是做SCADA或虚拟仪器软件的?
    • 关于注册ACTIVEX控件的问题
    • 如何判断一个文件比如说,在word,excel中中是否有图片?又怎么取得此图片加此保存呢?
    • 高手快来回答
    • WORD的一个签章控件
    • 我的OnDraw里面什么都没有为什么不能实现重绘
    • 是否可实现一个exe注册成2个CLASSI不同且名称也不同的OPC服务器

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

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