原文地址: 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
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之类的 未果。。。