ActiveX控件传递自定义类对象

时间:2022-08-19 09:00:26
大家好,我在VC6.0下创建了一个MFC ActiveX ControlWizard工程,工程名为Test,现在Automation中的Add Class中添加了一个基于CcmdTarget的CFPoint类,并在这个类中定义了double X,Y两个变量的Get/Set方法,同时也定义了两个成员变量m_dX,m_dY。现在odl中的TestCtrl中定义了[id(1)]CFPOINT* pt对象(为了导出CFPoint类用,不知大家是否还有别的导出自定义类方法)。然后在TestCtl类中添加了参数为CFPoint的函数,函数为SetPt(CFPoint* pt);
在BEGIN_DISPATCH_MAP中手动添加如下代码:
BEGIN_DISPATCH_MAP(CTest1Ctrl, COleControl)
//{{AFX_DISPATCH_MAP(CTest1Ctrl)
DISP_FUNCTION(CTest1Ctrl, "SetPt", SetPt, VT_EMPTY, VTS_DISPATCH)
//}}AFX_DISPATCH_MAP
DISP_FUNCTION_ID(CTest1Ctrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
END_DISPATCH_MAP()

同时,在odl中函数定义代码如下
methods:
// NOTE - ClassWizard will maintain method information here.
//    Use extreme caution when editing this section.
//{{AFX_ODL_METHOD(CTest1Ctrl)
[id(1)] void SetPt(CFPoint* pt);
//}}AFX_ODL_METHOD

通过如上设置,我的测试程序中能导出自定义类,同时也有这个方法。
我在客户端定义了
CFPoint pt;
pt.createDispatch("id");
pt.SetX(1);
pt.SetY(2);
通过getX,getY可以得到刚赋的值,但是传入SetPt(pt.m_lDispatch)时,无法得到正确的X,Y值,请问我该如何传递自定义类对象,自定义类的成员变量该如何定义?谢谢大家了,困扰了我两天的问题,怎么折腾都不行

22 个解决方案

#1


在线等待答案
有可能问题比较奇怪,请各位兄弟姐妹如有时间,帮忙写个有自定义类的小例子让我学习学习

#2


我的邮箱是:forest21000@yahoo.cn,麻烦大家了

#3


该回复于2011-05-30 10:04:06被版主删除

#4


恳请大家帮帮忙

#5


为什么没人回答呢

#6


难道没人看到我发的帖吗?还是我说明得不够详细呢?请大家指正

#7


COM不能直接导出类,要导出类有很多要求的,你还没了解COM的最基本原理。

#8


那请问r3000,我看到很多控件都有导出自定义类啊,比如说成熟的专题图制作控件TeeChart就有很多自定义类啊?
要导出类有很多要求的话,那一般有哪些要求呢?我应该看哪些资料呢?谢谢您的回答

#9


我理解最基本的原理,有错误请指出:

ActiveX 基于COM技术,在COM中没有类的概念,只有COM对象的概念,
所以。ActiveX是不能导出类的,只能导出一些简单的结构、指针等等,复杂的自定义类
必须转换为COM对象方可导出。
COM对象最基本的要求:有GUID,必须实现接口,如IUnkown.




#10


你应该看 COM原理类的资料。

#11


CFPoint* pt 如果是实现了接口的COM对象,那是可以的。
你看到TeeChart 中的,不是“自定义类”,而是实现了接口的COM对象。

#12


谢谢楼上的回答,我的CFPoint类继承了CCmdTarget类,导出后的类自动转换为继承于COleDispatcher类,应该属于COM对象吧?

#13


谢谢楼上的回答,我的CFPoint类继承了CCmdTarget类,导出后的类自动转换为继承于COleDispatcher类,应该属于COM对象吧?

#14


按理说是的,CCmdTarget应该是MFC定义的,对MFC做COM不了解。
你可测试一下pt.m_lDispatch,有没有正确的值? 

#15


r3000兄,谢谢你的回答!我已经解决了这个问题,传入参数定义为LPDISPATCH,在函数体内用FromDISPATCH解析LPDISPATCH参数即可获得传入的自定义类对象的属性信息。

#16


前几天电脑坏了,没法上网,不好意思了,r3000兄

#17


昨天又碰到一个问题,我定义了一个CFPoints类,即CFPoint的多点类,在该类中使用了CFPoint,定义如下:
vector<CFPoint> m_CFPoints ;
在CFPoints也定义了传入CFPoint的接口,然后,在外部调用的时候,定义了CFPoints的对象,也CreateDispatch了,第一次插入CFPoint时,可以正确插入值,但是,第二次插入值的时候,也插入了,但是退出函数的时候,报错了,报错的原因我调试是在判断该对象的ref值为0了,请问这是什么原因呢?

#18


引用计数需要+1 吧。
你的对象->m_lpDispatch->AddRef();
每增加一个引用都要调用一次AddRef();
估计跟引用计数有关。

#19


那请问r3000,这个计数是在传入函数前调用,还是在函数内实现?

#21


有点看不懂,呵呵,楼上的可以做个例子不

#22


COM不能直接导出类,要导出类有很多要求的,

#1


在线等待答案
有可能问题比较奇怪,请各位兄弟姐妹如有时间,帮忙写个有自定义类的小例子让我学习学习

#2


我的邮箱是:forest21000@yahoo.cn,麻烦大家了

#3


该回复于2011-05-30 10:04:06被版主删除

#4


恳请大家帮帮忙

#5


为什么没人回答呢

#6


难道没人看到我发的帖吗?还是我说明得不够详细呢?请大家指正

#7


COM不能直接导出类,要导出类有很多要求的,你还没了解COM的最基本原理。

#8


那请问r3000,我看到很多控件都有导出自定义类啊,比如说成熟的专题图制作控件TeeChart就有很多自定义类啊?
要导出类有很多要求的话,那一般有哪些要求呢?我应该看哪些资料呢?谢谢您的回答

#9


我理解最基本的原理,有错误请指出:

ActiveX 基于COM技术,在COM中没有类的概念,只有COM对象的概念,
所以。ActiveX是不能导出类的,只能导出一些简单的结构、指针等等,复杂的自定义类
必须转换为COM对象方可导出。
COM对象最基本的要求:有GUID,必须实现接口,如IUnkown.




#10


你应该看 COM原理类的资料。

#11


CFPoint* pt 如果是实现了接口的COM对象,那是可以的。
你看到TeeChart 中的,不是“自定义类”,而是实现了接口的COM对象。

#12


谢谢楼上的回答,我的CFPoint类继承了CCmdTarget类,导出后的类自动转换为继承于COleDispatcher类,应该属于COM对象吧?

#13


谢谢楼上的回答,我的CFPoint类继承了CCmdTarget类,导出后的类自动转换为继承于COleDispatcher类,应该属于COM对象吧?

#14


按理说是的,CCmdTarget应该是MFC定义的,对MFC做COM不了解。
你可测试一下pt.m_lDispatch,有没有正确的值? 

#15


r3000兄,谢谢你的回答!我已经解决了这个问题,传入参数定义为LPDISPATCH,在函数体内用FromDISPATCH解析LPDISPATCH参数即可获得传入的自定义类对象的属性信息。

#16


前几天电脑坏了,没法上网,不好意思了,r3000兄

#17


昨天又碰到一个问题,我定义了一个CFPoints类,即CFPoint的多点类,在该类中使用了CFPoint,定义如下:
vector<CFPoint> m_CFPoints ;
在CFPoints也定义了传入CFPoint的接口,然后,在外部调用的时候,定义了CFPoints的对象,也CreateDispatch了,第一次插入CFPoint时,可以正确插入值,但是,第二次插入值的时候,也插入了,但是退出函数的时候,报错了,报错的原因我调试是在判断该对象的ref值为0了,请问这是什么原因呢?

#18


引用计数需要+1 吧。
你的对象->m_lpDispatch->AddRef();
每增加一个引用都要调用一次AddRef();
估计跟引用计数有关。

#19


那请问r3000,这个计数是在传入函数前调用,还是在函数内实现?

#20


#21


有点看不懂,呵呵,楼上的可以做个例子不

#22


COM不能直接导出类,要导出类有很多要求的,