2012-02-21 46 views
0

我有一個函數「訪問衝突」 用的COleVariant

BOOL AltairListDialog::GetDocuments() 
{ 
    CComQIPtr<AXAPILib::ICollection> m_Collection; 
    HRESULT hr = m_Collection.CoCreateInstance(L"Axapi.Collection"); 
    AXAPILib::ICollection *indices = (AXAPILib::ICollection*) m_Collection.p; 

    int status; 
    COleVariant ind; 
    ind.vt = VT_DISPATCH; 
    ind.pdispVal = (IDispatch*) indices; 

    return TRUE; 
} 

我用它實現AXAPILib :: ICollection的一個DLL。該函數在「返回TRUE;」之後返回「訪問衝突」但我不知道爲什麼。有什麼建議麼?

回答

3

好,釣建議並不真正適合堆棧溢出’提問和答案的格式,所以它不會是unright投票關閉的問題。在另一方面,許多人可能會做同樣的壞事™,並可能被告知受益。所以:

  1. 不要用C風格的轉換一樣(AXAPILib::ICollection*) m_Collection.p。如果它不沒有投編譯,那麼它僅僅是錯誤。添加演員然後隱藏一個錯誤。

    在這種情況下,特定情況下移除鑄件應該不會有任何效果。但在代碼中有這樣的表演是完全不合時宜的。他們不僅隱藏的錯誤(通過抑制警告和錯誤),他們積極引入錯誤。

  2. 唐’ t使用C風格演員像(IDispatch*) indices。如果代碼在編譯時沒有編譯,那麼它就是錯誤。添加演員然後隱藏一個錯誤。

    對於第二個演員陣容,刪除演員陣容可能會有很大的影響。潛在的巨大影響是代碼不再編譯。在這種情況下,你知道什麼是錯的(雖然最有可能’沒有錯,除了演員本身)。

  3. 唐’噸混合智能指針和「原料」指針,除非你真的,真的真的知道你’重新做。

    這裏智能指針’的析構函數自動Release() es從函數返回的對象。該對象是新創建的,沒有其他引用。因此,其引用計數現在爲零,並且被銷燬。

函數返回後,引用被銷燬的對象是未定義行爲,很可能會產生您觀察到的不需要的行爲。

一個藥可醫是要求智能指針放棄其所含的原始指針的所有權。

對於您使用其MSDN Library文檔的特定Microsoft智能指針,您可以通過調用Detach()成員函數來做到這一點。令人困惑的是,wrt。命名爲C++標準庫’的智能指針,作爲一般約定,它通過調用release()成員來完成。值得注意的是,微軟Release()和標準庫release()是兩個非常不同的操作,分別是ref count遞減和uh,detach&hellip;

最後,最好不要使用Windows API ’的s BOOL,而應使用C++ bool。其中一個原因就是避免在代碼中全部使用大寫字母。更多的技術原因是bool只有兩個有效值,即falsetrue,而BOOL有幾十個不同的有效值,當新手程序員編寫像expression() == TRUE這樣的東西時,可能導致錯誤。