COM组件设计与应用(九)IDispatch 自动化接口 接口 for vc6.0 学习笔记

本文详细解析了MFC自动化接口的使用,包括Detach与Copy的区别,自动化接口实现过程,以及如何解决在不同组件间调用时遇到的错误。重点介绍了Sample5与Sample6组件的双接口应用,提供了调试与解决问题的实用技巧。

原文地址: http://www.vckbase.com/document/viewdoc/?id=1506
这篇文章看了好几遍才大概明白。。。

为了     解释执行(后绑定)  
诞生了 自动化接口(实现了 IDispatch 接口的组件)
Sample5只是演示一下 MFC 自动化方面的东西,和 ATL Sample6 双接口
主要是 为下面 自动化的双接口 做铺垫。

1.Detach 与 Copy区别:
VARIANT *pVal
pVal->bstrVal = bstr.Detach();
BSTR *pVal
*pVal = s.Copy();
Detach把劣种的BSTR剥离,以便在超出作用域的时候,析构函数不会释放BSTRDetach用于把CComBSTR 赋给[out]参数。
Copy用于产生一个BSTR的副本。一般用于用于把CComBSTR内容赋给[out]参数。
Detach better than Copy

2.// 这里比较没有使用 == ,而使用了运算符 & ,你知道这是为什么吗?
if((v1.vt & VT_I4) && (v2.vt & VT_I4) )    
我觉得可能这么做运算速度快吧

3. *pVal = cbstr.Copy(); 会报错  
我自己的问题  我把*pVal = NULL;  写成了pVal = NULL;
本来是清空指针的值, 我把指针给清空了。

4.( Qingtengguhe 发表于 2010-3-2 16:41:00)
我有一个问题想请教一下您:
我将您给的*.vbs中的第一行:
Set obj=CreateObject("Sample6.DispSample")
改成了:Set obj=CreateObject("Sample5.DispSample")
为什么会出现如下错误?
错误:ActiveX部件不能创建对象:'Simple5.DispSimple'
代码:800A01AD
simple5已经按您的说的方式:(执行菜单“Tools\Register control")进行注册
这个网友的提问  我觉得是由于Sample5 是一个 MFC的DLL 也就是说,它只能依赖于C++下调用使用 不能跨语言
office word 是VB  是pascal所以调用后异常


5. 我用VS2005 写了个小DEMO 调用 CLSID_DispSimple 组件  Add 异常(返回空置),跟踪发现是初始化CComVariant v_v1(v1)的问题,代码合并了一下,从组件里面拿出来如下:
CComBSTR bstr;
VARIANT v1;
::VariantInit(&v1);
v1.vt = VT_BSTR;
v1.bstrVal = _T("asd");
CComVariant aaa(v1);
都是空,换成//CComVariant aaa(&v1);  则CComVariant认成是BOOL类型,无语了
但是VBS 调用就没问题。。。。


6.还有就是VC++里面调用 COM组件的方法,
#include "Simple6.h"
#include "Simple6_i.c"
得引用.h 及_i.c文件
其他的方式 尝试了一下直接掉idl之类的 未果。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值