【发布时间】:2020-06-01 16:12:19
【问题描述】:
我想使用编译成 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,
)
}
其中setProxy 是syscall.GetProcAddress(DLL,"setProxy") 的结果
问题是,当我查看 DLL 生成的日志时,所有的 *uint16 只包含一个字符而不是整个字符串,而 port 包含了很好的信息。
因此,我的问题是:
如何在Syscall 的参数中传递整个字符串,而不仅仅是第一个字符?
编辑
如果我将StringToCString 中的return &p[0], nil 更改为return &p[i], nil
我获得了字符串的第 i 个字符...所以问题确实存在,我只是知道如何解决它...
【问题讨论】:
标签: c windows go dll type-conversion