簡體   English   中英

在 Go 中將字符串傳遞給 Syscall 的參數

[英]Pass String to argument of Syscall in Go

我想使用編譯成 DLL 的 C 函數。 這是我想使用的 C 函數:

int setProxy(const proxy_config* p_proxy);

它需要一個指向 C 結構的 const 指針,定義如下:

typedef struct
{
    char *host_address; 
    int port;           
    char *username;     
    char *password;     
} proxy_config;

為此,我將這個 C_structure 轉換為 Go 等價物,如下所示:

type proxy_configuration struct {
    host_address *uint16 
    port int             
    username *uint16     
    password *uint16     
}

要轉換字符串,我使用以下函數:

func StringToCString(s string) (*uint16, error) {
    for i := 0; i < len(s); i++ {
        if s[i] == 0 {
            return nil, errors.New("Problem with the string : "+s)
        }
    }
    p := utf16.Encode([]rune(s + "\x00"))

    return &p[0], nil
}

然后我稱之為:

import (
    "syscall"
    "unsafe"
)

func SetProxy(host_address string, port int, username string, password string) error {

    [...Conversion code from Go string to Struct...]

    var nargs uintptr = 1
    ret, _, callErr := syscall.Syscall(
        uintptr(setProxy), 
        nargs,
        uintptr(unsafe.Pointer(&proxy)), 
        0,
        0,
    )
}

其中setProxysyscall.GetProcAddress(DLL,"setProxy")

問題是,當我查看 DLL 生成的日志時,所有*uint16只包含一個字符而不是整個字符串,而 port 包含好的信息。

因此,我的問題是:

如何在Syscall的參數中傳遞整個字符串而不僅僅是第一個字符?


編輯

如果我通過return &p[i], nilStringToCString更改return &p[0], nil我獲得字符串的第 i 個字符......所以問題肯定存在,我只知道如何解決它。 ..

在 Go 中將字符串傳遞給 Syscall 的參數

如何在 [Windows] Syscall 的參數中傳遞整個字符串?


一個顯而易見的答案是查看 Go 標准庫,它進行了許多 Windows 系統調用。


包裝窗口

golang.org/x/sys/windows

函數 UTF16FromString

 func UTF16FromString(s string) ([]uint16, error)

UTF16FromString 返回 UTF-8 字符串 s 的 UTF-16 編碼,並添加終止 NUL。 如果 s 在任何位置包含 NUL 字節,則返回 (nil, syscall.EINVAL)。

func UTF16PtrFromString

 func UTF16PtrFromString(s string) (*uint16, error)

UTF16PtrFromString 返回指向 UTF-8 字符串 s 的 UTF-16 編碼的指針,並添加終止 NUL。 如果 s 在任何位置包含 NUL 字節,則返回 (nil, syscall.EINVAL)。

函數 UTF16ToString

 func UTF16ToString(s []uint16) string

UTF16ToString 返回 UTF-16 序列 s 的 UTF-8 編碼,刪除了終止 NUL。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM