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


原文地址: 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 剥离,以便在超出作用域的时候,析构函数不会释放 BSTR Detach 用于把 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、付费专栏及课程。

余额充值