Я хотел бы использовать функцию C, скомпилированную в DLL. Вот функция C, которую я хотел бы использовать:
int setProxy(const proxy_config* p_proxy);
Требуется постоянный указатель на структуру C, определенную следующим образом:
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
содержат только один символ, а не вся строка, тогда как порт содержит хорошую информацию.
Таким образом, мой вопрос:
Как передать целые строки в параметрах Syscall
, а не только в первом символ?
РЕДАКТИРОВАТЬ
Если я изменю return &p[0], nil
в StringToCString
на return &p[i], nil
, я получу i-й символ строки. .. Так что проблема определенно есть, я просто знаю, как ее исправить ...