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
該語句導致在每次調用 AddRef 或 Release 時,“輸出”視窗均顯示介面的當前引用數以及對應的類名和介面名稱。
若要在 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)