Com 開發注意事項

來源:互聯網
上載者:User

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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.