2011-05-10 42 views
2

COM中的WCHAR接口是一件好事嗎?COM中的WCHAR接口是一件好事嗎?

我一直在搜索互聯網上的這個問題的答案沒有結果。

基本上應該在COM中使用char */wchar *還是應該使用BSTR來代替?

它安全嗎?

在此代碼示例其字符串(代碼從隨機源抓起):

STDMETHOD(SetAudioLanguageOrder(WCHAR *nValue)) = 0; 
STDMETHOD_(WCHAR *, GetAudioLanguageOrder()) = 0; 

我在什麼時候使用什麼與所有編組,內存邊界等談論時出現混亂COM。

什麼是數據緩衝區(字節*)?

回答

1

如果您打算支持C++以外的雙接口和客戶端,請使用BSTR。如果所有的調用者都是C++,那麼WCHAR *很好。

2

這取決於呼叫者會給你打電話的上下文。首先,如果您使用非自動化類型,封送處理將不會自動執行。因此,您最終必須編寫自己的編組器來跨越流程邊界移動wchar_t *。

也就是說,沒有規則說你不能在COM接口中傳遞wchar_t *。有許多COM接口傳遞自定義類型(結構體,指向結構體,回調等的指針),這些都只是關於您的需求。

在你的界面,如果你使用WCHAR字符串,我會宣佈SetAudioLanguageOrder這樣:

STDMETHOD(SetAudioLanguageOrder(const WCHAR *nValue)) = 0; 

這使得它更清楚誰是(不)應該釋放該字符串,並提供更多的上下文如何處理字符串(不鼓勵調用者修改字符串,但調用者可以強制這種行爲,如果他們想寫錯誤的代碼)。

GetAudioLanguageOrder調用是可以的,但現在的問題是:誰釋放返回的字符串,它應該如何釋放?通過免費(...)?或者C++刪除[]?如果你使用BSTR,那麼你知道 - 使用SysFreeString。這是使用BSTR而不是WCHAR字符串的原因之一。

0

您必須能夠以某種方式知道該數組的長度。在C或C++中,通常使用以空字符結尾的字符串,並且您經常在一個進程中使用它們 - 被調用程序訪問與調用程序準備的相同的數據,並以null結尾。

與COM不一樣 - 您可能想要創建一個out-proc服務器或在代理過程中使用您的in-proc服務器,然後您需要編組 - 一個在進程或線程之間傳輸數據的中間件機制- 上班。該機制不會知道字符串的大小,除非您使用MIDL屬性之一(如size_is)來指定正確的數組大小。使用這些屬性將需要每個陣列的額外參數 - 這會使接口複雜化,並且在處理數據時需要額外的關注。

也就是說,在大多數情況下,只需使用BSTR即可獲得更流暢的界面。