• 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 > 讨厌的DISPATCH_MAP映射自定义参数

讨厌的DISPATCH_MAP映射自定义参数

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

佚名通过本文主要向大家介绍了begin dispatch map,declare dispatch map,dispatch,dispatch是什么意思,dispatchtouchevent等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 讨厌的 DISPATCH_MAP 映射自定义参数
描述:

我遇到一个十分讨厌的DISP_FUNCTION_ID参数映射问题,希望高手能够指点迷津。
我在MFC的ActiveX工程中定义了一个结构体,并希望把这个结构体作为一个方法的参数暴露出去。
在MyInt.idl文件中这样定义:
[uuid(...), version(1.0), helpfile("MyInt.hlp"), control]
library MyIntLib
{
  importlib(STDOLE_TLB);
typedef [uuid(...)]
  struct tagPerson{
  int age;
}Person;
[uuid(...)]
dispinterface _DMyInt{
  properties:
  methods:
    [id(1)] void Grows([in]Person* p);
};
[uuid(...)]
dispinterface _DMyIntEvents
{
  properties:
  methods:
};
[uuid(...), control]
coclass MyInt
{
  [default] dispinterface _DMyIM;
  [default, source] dispinterface _DMyIMEvents;
};
};
编译idl文件后,好象得到了一个MyIntidl.h文件,在MyIntCtrl.h中定义了一个方法:
#include "MyIntidl.h"
class CMyIntCtrl : public COleControl
{
  ......
public:
  enum {
    dispidGrows = 1L,
  };
protected:
  void Grows(Person* p);
};
在MyIntCtrl.cpp中定义为:
...
BEGIN_DISPATCH_MAP(CMyIMCtrl, COleControl)
  DISP_FUNCTION_ID(CMyIMCtrl, "Grows", dispidGrows, Grows, VT_EMPTY, VTS_PVARIANT)
END_DISPATCH_MAP()
...
void CMyIntCtrl::Grows(Person *p)
{
  if(p != NULL) p->age ++;
}
这样可以成功编译出一个OCX,但是,当在VB中使用这个OCX时,会出数据类型错误:
VB中:
Dim p As Person
p.age = 10
MyInt1.Grows p ' <== 就在这里出了数据类型错误。
我想应该是DISP_FUNCTION_ID中参数映射出了错误,可是我几乎尝试了各种参数映射,都是一样的错误。当然,我可以不需要这样暴露参数,但我面临的工程十分庞大,不这样暴露参数会使得接口难以维护。我当然相信使用COM技术能够以这种方式暴露参数。所以,在这里我需要你的帮助。


解决方案1:

你这个自定义结构用在普通COM接口上是没有问题的
但是你的组件是ActiveX实现的是IDispatch接口,IDispatch接口中必须使用自动化兼容数据类型,很遗憾IDispatch应该不支持自定义结构体。
可以参考《ATL开发指南》中的第四章 接口、接口定义语言和调度,其他COM书籍有介绍分派接口的部分也会有介绍。


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

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

  • BEGIN_INTERFACE_MAP如何正确来使用
  • BEGIN_COM_MAP宏,为何包含了一个_cache函数以及实现?
  • BEGIN_EVENTSINK_MAPBEGIN_SINK_MAP//有啥区别。。。
  • 讨厌的DISPATCH_MAP映射自定义参数

相关文章

  • 2017-06-04 紧急求援:怎么讲一个字符串传到ATLCOM的对话框的编辑框中??谢谢!!
  • 2017-06-05 Dll,程序不会调试,请教大家!本人看《WINDOWS程序设计》第五版中程序————
  • 2017-06-04 在调用组件过程中,时常会出现--"服务器正在运行中"的提示。
  • 2017-06-05 MicrosoftRDPClientContorl失败
  • 2017-06-05 vc中显式调用dll的问题
  • 2017-06-05 ADO访问mysql的time类型
  • 2017-06-04 介绍本学COM,ATL的好书。
  • 2017-06-04 怎样在MFC工程中使用IEnumString接口?
  • 2017-06-05 socket发送和接收顺序执行问题,请高手指点
  • 2017-06-04 多线程调用COM的问题,吐血送分,把答案追求到底

文章分类

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

最近更新的内容

    • 为什么在ASP中调用不了OCX的属性和方法?
    • 可否利用以有的com组件再做一个新的com组件,而且不依赖以前的com组件,如何做
    • 如何使用FFDSHOW中的filter
    • 进程监控器,保证程序不死。
    • 做cab文件的时候怎么指定一个目录输出的路径?比如C:\WINNT,DestDir=10好像不行?
    • 域普通用户如何使用activex?
    • VC中应用OCX怎样处理多事件?
    • 关于进程在win2k下隐藏的问题
    • ftp协议下的多线程传送文件是指:为每个被传送文件创建一个线程,同时传送多个文件?还是用多个线程传送同一个文件?它们是如何实现的?
    • 线程中调用全局函数失败,为什么?

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

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