2010-04-28 46 views
5

我們有以下接口:COM服務器是否必須爲[out]參數調用SysFreeString()?

[object, uuid("uuidhere"), dual ] 
interface IInterface : IDispatch 
{ 
    [id(1), propget] HRESULT CoolProperty([out, retval] BSTR* result); 
} 

現在有一個小問題。一方面參數是「out」,所以任何值都可以作爲輸入傳遞,參數只有在成功返回時纔有效。另一方面,有this MSDN article從許多頁面鏈接到基本上說(最後一段),如果任何函數通過BSTR*它必須釋放字符串之前分配一個新的字符串。

這很可怕。如果這篇文章是正確的,這意味着所有的調用者都必須通過有效的BSTRs(可能是空BSTRs),否則BSTR傳遞可能會泄露。如果調用者傳遞了一個隨機值並且被調用者試圖調用SysFreeString()它會遇到未定義的行爲,因此約定很關鍵。

那麼[out]屬性有什麼意義呢?在這種情況下,[in, out][out]之間有什麼區別?

該文章對不對?在分配新參數之前,我需要釋放通過的BSTR [out]參數嗎?

回答

4

您應該期望客戶端遵循合同,遵守[out]屬性並且不通過需要釋放的初始化BSTR。仔細檢查和預期NULL是而不是好的,合同不要求客戶端將指針傳遞到初始化的內存位置。你通常會得到一個指向堆棧幀中分配的BSTR變量的指針。它可能包含隨機垃圾,只有防守程序員會將其設置爲NULL。

它在其他方面與OLE自動化不兼容。在這種情況下只有[out,retval]和[in,out]是有效的,無疑是爲了避免這個特殊的陷阱。

3

documentation指出,OUT指針不應該被被調用者釋放,因此,恕我直言,你會更好地遵守規範。

最好

相關問題