回答
兩個函數在看通常std.string.toStringz
和std.utf.toUTFz
。
toStringz
會將string
轉換爲immutable(char)*
,您可以將它傳遞給C函數,該函數需要const char*
。如果它可以確定string
是空終止的(通常只是字符串文字的情況,其中有一個空終止符通過它們的結尾),那麼它將不分配並且將僅使用string
的ptr
屬性,但在大多數情況下,它會分配。
toUTFz
將從任何字符串類型轉換爲任何字符指針類型。由於所有用於Windows的W
功能都採用UTF-16,但它也可用於轉換爲char*
- 例如,它可能最常用於轉換爲Windows的const(wchar)*
。 str.toUTFz!(char*)()
。像toStringz
,它會盡量不分配,如果它可以確定它是不必要的,但它幾乎總是有必要的。
現在,對於您的特殊情況,您正嘗試使用Windows中的A
函數之一。這幾乎總是一個壞主意,我強烈建議不要這樣做。使用toUTFz
將您的string
轉換爲const(wchar)*
並將其傳遞給CreateWindowW
。 AFAIK,A
功能的唯一優勢是它們可以在Win2K之前使用。關於他們的一切都更糟。但是,如果由於某種原因,您堅持使用A
函數,那麼您將不得不使用std.windows.charset.toMBSz
,因爲A
函數不採用UTF-8而是採用「Windows 8位字符集」,並且toMBSz
會將字符串轉換爲該格式。 「
我使用Windows-ASCII函數的原因是因爲我無法在'core.sys.windows.windows'模塊中找到廣泛的函數,因此我總結出D沒有實現這些函數。 –
@JeroenBollen所需要的只是函數原型,所以如果druntime由於某種原因沒有它,你可以自己聲明它。但是,大多數使用Windows API的D程序員使用的是http://www.dsource.org/projects/bindings/wiki/WindowsApi,它比druntime更完整。 –
所以我可以做一些像'extern(Windows)void * CreateWindowW(...);',它會工作嗎?沒有需要鏈接的外部庫或要包含的模塊? –
你抓住D數組的ptr
字段。和length
字段搶長度
然而,如果你需要一個C風格的字符串,那麼你需要toStringz
方法,將添加空終止符並返回指向第一個字符的指針。 k
EEP對它的引用,如果API不創建它自己的拷貝工作由GC避免懸擺指針
一般而言,這是正確的。但是,對於Windows'A'函數,它不是,因爲它們採用'char',但它們不使用UTF-8。你需要'std.windows.charset.toMBSz'。 –
- 1. 排序C風格陣列
- 2. 固定尺寸C風格陣列
- 3. 從C風格陣列釋放內存
- 4. REST風格瓶解析JSON陣列,parse_args()
- 5. 陣營本地AlertIOS風格
- 6. 傳遞陣列到Openlayers 3與地理定位和風格
- 7. 打印出2-d陣列格式
- 8. 列特定風格
- 9. QHeaderView風格每列
- 10. 風格化列表?
- 11. 優化C++ 2-d陣列
- 12. 陣列格式
- 13. 格式陣列
- 14. 表格陣列
- 15. 改變點擊的元素的風格陣列thorugh的JavaScript
- 16. 從動畫風格的陣列動畫圖像
- 17. 使用malloc創建我的類的2D空調風格陣列
- 18. 風格由主和分區的Multidimencional陣列
- 19. 以不同編碼風格構建陣列的問題
- 20. JQuery手風琴風格列表
- 21. 動態inilne風格陣營本地
- 22. C++風格的註釋風格
- 23. HTML表格到php陣列
- 24. C++ JSON序列化,Proto-buf風格
- 25. Javascript陣列整數陣列格式
- 26. 風格在Python序列
- 27. WPF Metro風格列表框
- 28. dreferencing 2 d陣列
- 29. WPF風格綁定到基本風格
- 30. 如何通過C風格的矩陣在Objective-C
」喜歡冒着緩衝區溢出的代碼可以將指針從數組中嚇跑(通過使用'arr.ptr')「 - 來自官方教程,2分鐘後發現搜索結果。 – 2013-12-14 22:45:22
@ H2CO3通常這是一個壞主意,因爲D字符串不是空終止的,C字符串通常是。將'ptr'傳遞給一個C函數只有在它接受了這個長度並且不會在它傳遞的數組中尋找一個空終止符時才起作用。 –
@JonathanMDavis確切地說(但是傳遞一個明確的長度通常是一個更好的主意......) – 2013-12-14 23:31:01