登录
首页 >  Golang >  Go问答

sys 模块中涉及 I/O 操作的疑问

来源:stackoverflow

时间:2024-03-09 18:18:27 436浏览 收藏

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《sys 模块中涉及 I/O 操作的疑问》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!

问题内容

因为我想使用createfile函数访问一些较低级别的api来进行i/o操作 syscall.createfile( 名称 *uint16...) 这样做时我遇到一个问题,名称参数是 *uint16 但它应该是一个数组([]uint16),以便它可以处理 utf-16 格式的字符串。正如我们在 microsoft -> 链接提供的示例中看到的,其中 text 宏将字符串转换为 wchar_t 数组,或者我们可以说 []uint16。

提前致谢,如果我说错了什么,我很抱歉,因为我只是这个领域的一个小孩。

(解决方案 1) func utf16ptrfromstring(s string) (*uint16, 错误) 内置编码器返回指向 utf-16 编码的指针

(解决方案 2) 与之前一样,我不知道解决方案 1,因此我编写了自己的函数,该函数执行完全相同的工作,因此您可以忽略此解决方案

为了将文件名(字符串)传递给 sys 包,我们必须首先将字符串转换为 utf-16 数组并传递第一个元素的指针

var srcUTf16 [ ]uint16 = utf16.Encode([ ]rune(src+ "\x00"))
syscall.CreateFile(&srcUTf16[0],..... )
  1. 编辑:-添加解决方案
  2. 编辑:- 添加正确的解决方案并在解决方案 2 中添加终止 nul。

解决方案


我不太关心 go 所做的 windows api 函数签名,我有 written about this。所以如果你愿意,你可以编写你自己的。创建一个像这样的文件:

//go:generate mkwinsyscall -output zfile.go file.go
//sys createfile(name string, access int, mode int, sec *windows.securityattributes, disp int, flag int, template int) (hand int, err error) = kernel32.createfilew
package main
import "golang.org/x/sys/windows"

func main() {
   n, e := createfile(
      "file.txt",
      windows.generic_read,
      0,
      nil,
      windows.create_new,
      windows.file_attribute_normal,
      0,
   )
   if e != nil {
      panic(e)
   }
   println(n)
}

然后构建:

go mod init file
go generate
go mod tidy
go build

我知道结果有效,因为它第一次返回有效句柄,第二次返回无效句柄(当然也因为创建了一个文件):

PS C:\> .\file.exe
336
PS C:\> .\file.exe
-1

如果您愿意,您可以编辑我上面放置的签名行,以满足您的需求。

以上就是《sys 模块中涉及 I/O 操作的疑问》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>