Arrays D样式数组到C样式数组
我正在用D创建一个窗口,而Arrays D样式数组到C样式数组,arrays,pointers,d,Arrays,Pointers,D,我正在用D创建一个窗口,而CreateWindowA函数需要指向字符的指针,基本上是C字符数组 如何将D样式数组(char[])转换为C样式数组(char*)?您可以获取D数组的ptr字段。和length字段来获取长度 但是,如果您需要一个C样式的字符串,那么您需要一个方法来添加空终止符并返回指向第一个字符的指针k如果api没有创建自己的副本来操作,则保留对它的引用,以避免GC挂起指针您抓取D数组的ptr字段。和length字段来获取长度 但是,如果您需要一个C样式的字符串,那么您需要一个方法来
CreateWindowA
函数需要指向字符的指针,基本上是C字符数组
如何将D样式数组(
char[]
)转换为C样式数组(char*
)?您可以获取D数组的ptr
字段。和length
字段来获取长度
但是,如果您需要一个C样式的字符串,那么您需要一个方法来添加空终止符并返回指向第一个字符的指针
k
如果api没有创建自己的副本来操作,则保留对它的引用,以避免GC挂起指针您抓取D数组的ptr
字段。和length
字段来获取长度
但是,如果您需要一个C样式的字符串,那么您需要一个方法来添加空终止符并返回指向第一个字符的指针
k
eep引用它,如果api没有创建自己的副本来操作,以避免GC挂起指针要查看的两个函数是正常和
toStringz
将string
转换为immutable(char)*
,您可以将其传递给采用const char*
的C函数。如果它可以确定字符串
以null结尾(这通常只是字符串文本的情况,它的结尾有一个null终止符),那么它不会分配,只会使用字符串
的ptr
属性,但在大多数情况下,它会分配
toUTFz
将从任何字符串类型转换为任何字符指针类型。它可能最常用于转换为Windows的const(wchar)*
,因为Windows的所有W
函数都采用UTF-16,但它也可用于转换为char*
——例如str.toUTFz!(char*)()
。像toStringz
,如果它能确定它是不必要的,它将尝试不分配,但它几乎总是必要的
现在,对于您的特定情况,您正在尝试在Windows中使用一个
A
函数。这几乎总是一个坏主意,我强烈建议不要这样做。使用toUTFz
将字符串
转换为const(wchar)*
并将其传递给CreateWindowW
。顺便说一句,A
函数的唯一优点是它们与Win2K之前的版本一起工作。他们的其他一切都更糟。但是,如果出于某种原因,您坚持使用A
函数,那么您将不得不使用,因为A
函数不采用UTF-8,而是采用“Windows 8位字符集”,并且toMBSz
会将字符串转换为该格式。要查看的两个函数是正常的
toStringz
将string
转换为immutable(char)*
,您可以将其传递给采用const char*
的C函数。如果它可以确定字符串
以null结尾(这通常只是字符串文本的情况,它的结尾有一个null终止符),那么它不会分配,只会使用字符串
的ptr
属性,但在大多数情况下,它会分配
toUTFz
将从任何字符串类型转换为任何字符指针类型。它可能最常用于转换为Windows的const(wchar)*
,因为Windows的所有W
函数都采用UTF-16,但它也可用于转换为char*
——例如str.toUTFz!(char*)()
。像toStringz
,如果它能确定它是不必要的,它将尝试不分配,但它几乎总是必要的
现在,对于您的特定情况,您正在尝试在Windows中使用一个
A
函数。这几乎总是一个坏主意,我强烈建议不要这样做。使用toUTFz
将字符串
转换为const(wchar)*
并将其传递给CreateWindowW
。顺便说一句,A
函数的唯一优点是它们与Win2K之前的版本一起工作。他们的其他一切都更糟。但是,如果出于某种原因,您坚持使用A
函数,那么您将不得不使用,因为A
函数不采用UTF-8,而是采用“Windows 8位字符集”,并且toMBSz
将字符串转换为该格式“具有缓冲区溢出风险的代码可以将指针从数组中吓跑(通过使用arr.ptr
)“-来自官方教程,在谷歌搜索2分钟后发现。@H2CO3这通常是个坏主意,因为D字符串不是以null结尾的,而C字符串通常是以null结尾的。”。将ptr
传递给C函数仅在它也需要长度时有效,并且不会在传递的数组中查找空终止符。@JonathanMDavis完全正确(但传递显式长度通常是更好的主意…)“喜欢冒缓冲区溢出风险的代码可以将指针从数组中吓跑(通过使用arr.ptr
)“-来自官方教程,在谷歌搜索2分钟后发现。@H2CO3这通常是个坏主意,因为D字符串不是以null结尾的,而C字符串通常是以null结尾的。”。将ptr
传递给C函数仅在它也接受长度时有效,并且不会在传递的数组中查找空终止符。@JonathanMDavis完全正确(但传递显式长度通常是更好的主意…)通常,这是正确的。但是,对于WindowsA
函数,它不是,因为它们使用char
,而不使用UTF-8。对于它们,您需要std.windows.charset.toMBSz
。一般来说,这是正确的。但是,对于WindowsA
函数,它不是,因为它们使用char
,而不使用UTF-8。您需要std.windows.charset.toMBSz
,这就是我使用的原因