【发布时间】:2021-05-16 05:48:01
【问题描述】:
因为我想使用 CreateFile 函数访问一些较低级别的 API 来执行 I/O 操作 syscall.CreateFile( name *uint16…) 这样做时我面临一个问题,名称参数是 *uint16 但它应该是一个数组 ([]uint16) 以便它可以处理 UTF-16 格式的字符串。正如我们在 Microsoft 提供的示例中看到的那样 -> link 其中TEXT 宏将字符串转换为 wchar_t 数组,或者我们可以说 []uint16。
提前谢谢,如果我说错了,我只是这个领域的蹒跚学步的孩子。
(解决方案 1)
func UTF16PtrFromString(s string) (*uint16, error)
内置编码器,返回指向 UTF-16 编码的指针
(解决方案 2) 因为之前我不知道解决方案 1,所以我编写了自己的函数来完成确切的工作,因此您可以忽略此解决方案
为了将文件名(字符串)传递给 sys 包,我们必须首先将字符串转换为 UTF-16 数组并传递第一个元素的指针
var srcUTf16 [ ]uint16 = utf16.Encode([ ]rune(src+ "\x00"))
syscall.CreateFile(&srcUTf16[0],..... )
- 编辑:-添加解决方案
- 编辑:- 添加正确的解决方案并在解决方案 2 中添加终止 NUL。
【问题讨论】:
-
[]uint16不是一个数组,它是一个切片,不能传递给系统调用。参数与 C 中的参数相同。 -
你有什么问题?
-
关于您的编辑,x/sys/windows 包有一个
UTF16PtrFromString函数可以正确编码。您的版本缺少终止的 null。 -
@JimB 感谢您的纠正。刚来这里是为了纠正我的错误,因为有人在另一个论坛中指出了同样的错误,然后看到了你的评论????顺便说一句