2014-02-09 30 views
6

這是我的理解(並請糾正我,如果我錯了),他們之間的唯一區別是該字符串是否可能被調用函數修改。 (PCWSTRLPWSTRPCWSTR vs LPWSTR

現在我想從C#中的字符串傳遞給期待PCWSTR功能,但所有我能找到的[MarshalAs(UnmanagedType.LPWStr)]。我糾正這是好的嗎? (是的,它工作。也就是說,雖然不是證明它的罰款。有些事情工作但隨後導致內存泄漏等)

回答

10

PCWSTR是一個時代不合時代,恐龍與人類的電影風格。找到一個在Unicode字符串上使用短指針的16位程序,就像找到一隻白色的大象。只有LPCWSTR和LPWSTR之間的區別是有意義的。

LPCWSTR中的C只是const C語言關鍵字的註釋。它承諾被調用的函數永遠不會修改您傳遞的字符串。在該語言中知道這一點非常重要,將字符串文字傳遞給LPWSTR參數並不安全。當程序嘗試更新字符串並因內存頁爲只讀而失敗時,很可能會使程序崩潰。

而且,它重要時,你pinvoke。將System.String傳遞給LPCWSTR參數沒有問題,字符串在.NET中是不可變的,因此您將得到一個保證,即interned字符串不會被破壞。很難診斷問題。明確使用[MarshalAs(UnmanagedType.LPWStr)]通常不需要,您可以使用[DllImport]屬性中的CharSet.Auto屬性並免費獲取LPWStr封送處理。

但是如果參數類型是LPWSTR那麼你必須而不是傳遞一個StringBuilder。有足夠的容量允許本地代碼在構建器緩衝區中四處寫入字符串。

+0

非常感謝。 – ispiro

2

函數採取PCWSTR參數不能使用該參數修改字符串的字符,而不像使用參數LPWSTR的函數。字符串的每個字符存儲爲WCHAR

UnmanagedType.LPWStr是這種字符串的正確編組類型。

+0

PCWSTR和LPWSTR都使用WCHAR來存儲一個字符。這就是他們的名字中的「W」。 – Dirk