登录
首页 >  Golang >  Go问答

将字符串传递给Go语言系统调用的参数

来源:stackoverflow

时间:2024-02-28 09:12:23 321浏览 收藏

“纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《将字符串传递给Go语言系统调用的参数》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新Golang相关的技术文章,有好的建议欢迎大家在评论留言,非常感谢!

问题内容

我想使用编译成 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_struct 转换为 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], nil 更改 stringtocstring 中的 return &p[0], nil 我获得了字符串的第 i 个字符...所以问题肯定存在,我只是知道如何解决它...


解决方案


一个明显的答案是查看 Go 标准库,它进行许多 Windows 系统调用。

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

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