COM FAQ 以后逐日累加

来源:互联网 发布:杭州数游软件 编辑:程序博客网 时间:2024/04/27 18:01

1. Debug 下没问题, Release 版本编译 error LNK2001: unresolved external symbol _main
   去掉 _ATL_MIN_CRT

2. Release MiniDependency版本的中文路径问题

修改StatReg.h
CParseBuffer的
AddString函数,
修改
lpszT++

lpszT = CharNext(lpszT);

3.. CComBSTR的&(取地址)操作符没有检查m_str是否为空,CComVariant没有重载&操作符,因此下面的用法
CComBSTR或CComVariant Temp;
p->Method1(&Temp);
// 使用Temp...
p->Method2(&Temp);
// 使用Temp...
是错误的,但编译器不会发出任何警告,也不会产生运行时断言。

4. 当方法的out参数是BSTR、VARIANT或接口指针时,
HRESULT MyClass::Method1(BSTR|VARIANT|Interface *pVal)
{
    *pVal = m_Val;
    return S_OK;
}
上面的做法是错误的,因为out参数在调用方要被释放一次。正确且优美的做法是
HRESULT MyClass::Method1(BSTR|VARIANT|Interface *pVal)
{
    return m_Val.CopyTo(pVal);    // m_Val是CComBSTR或CComPtr

    CComVariant Temp(m_Val);      // m_Val是CComVariant
    return Temp.Detach(pVal);
}

5. nt4提到的问题是ATL3.0的一个BUG,
pvars[0] = &var;
DISPPARAMS disp = { pvars, NULL, 1, 0 };
pDispatch->Invoke(0x2, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL);
上面是框架产生的Fire函数一段代码,因为CComVariant没有形如CComVariant(const VARIANT *pSrc)的构造函数,因此pvars[0] = &var调用的将是CComVariant(bool bSrc),而这可能是错误的,因此编译器发生警告。只要改为pvars[0] = var即可。

6. 安装了 PlatSDK 后,出现
C2668: 'InlineIsEqualGUID' : ambiguous call to overloaded function  问题

修改 InlineIsEqualGUID() 为
::ATL::InlineIsEqualGUID()

详细内容见
http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/Q243/2/98.ASP&NoWebContent=1

7.《COM高手心经》实践19 总是初始化[out] 参数
 出口参数先置 NULL

XXX::YYY(ZZZ *pZAAA)
{
      if(IsBadWritePtr(pZAAA)) ////// IsBadWritePtr 98 下不能检测到 oxccccccc 这些没初始化的指针 pZAAA
      {
         return E_POINTER;
       }
      
      *pZAAA = NULL; //////////
      。。。。。。。。。
}

8。 调试

若要在 ATL 中跟踪引用数,请在包括 atlbase.h 之前添加以下代码行:

#define _ATL_DEBUG_INTERFACES

该语句导致在每次调用 AddRefRelease 时,“输出”窗口均显示接口的当前引用数以及对应的类名和接口名称。

若要在 ATL 中调试 QueryInterface 调用,请在包括 atlcom.h 之前添加以下定义:

#define _ATL_DEBUG_QI

然后在调试时,在“输出”窗口中查找在对象上查询的每个接口的名称。

查看器和 Spy 程序允许查看计算机上和内存中的对象和事件。

OLE/COM 对象查看器
OLEVIEW 显示计算机上安装的 ActiveX 和 OLE 对象以及它们支持的接口。它还允许编辑注册表和查看类型库。有关更多信息,请参见使用 OLE/COM 对象查看器
IDataObject 数据对象查看器
DOBJVIEW 显示 ActiveX 和 OLE 数据对象(由剪贴板或拖放操作创建)所提供的数据格式的列表。有关更多信息,请参见 DOBJVIEW。

9. AtlInitCommonControls ( ICC_COOL_CLASSES | ICC_BAR_CLASSES);

如果直接用atl 写界面,出现 listview 等控件无法现实,请先检查是否初始化

10. 在线程中用 COM, 需要初始化COM,  ::CoInitialize(NULL)

原创粉丝点击