我在 go 中编译了一个 DLL 作为一个 c 共享库,它接受一个字符串作为参数,它在其他语言中工作正常,比如使用 ctypes 模拟 c 字符串和 java 的 python,但是当试图在 delphi 中使用这个 dll 时,我无法将字符串作为参数传递。 这是 GO 中的函数声明
`//export RequestCertificate
func RequestCertificate(jsonString string) *C.char{
log.Println("String: ", jsonString)`
在 Python 中,我声明了一个模拟 c 字符串的结构
` class GoString(Structure):
_fields_ = [("chars", c_char_p), ("length", c_longlong)] `
并将这个结构作为参数传递
`jsonStr = json.dumps(payload)
jsonB64 = base64.b64encode(bytes(jsonStr, "ansi"))
goJson = GoString(jsonB64, len(jsonB64))
response = [GoString]
response = lib.RequestCertificate(goJson)`
在终端中,dll 显示的正是我所期望的
`String: eyJ1cmwiOiAiaHR0cHM6Ly9scC5ub...`
但我无法在 delphi 中复制它
这就是我声明模拟 C 字符串的结构的方式
`type
TGoString = record
chars: PAnsiChar;
length: LongInt;`
`jsonStr := payload.ToString;
jsonBytes := TEncoding.ANSI.GetBytes(jsonStr);
jsonB64 := TNetEncoding.Base64.Encode(jsonBytes);
goJson.chars := PAnsiChar(jsonB64);
goJson.length := Length(jsonB64);
response := RequestCertificate(goJson);`
但我得到的只是一个空回复
`String:`
我已经更改了我的 GO 函数的声明以接收 c 字符串而不是那样的 go 字符串
` //export RequestCertificate
func RequestCertificate(CString *C.char) *C.char{
log.Println("C String: ", CString)
goString := C.GoString(CString)
log.Println("GoString: ", goString)`
python中的结果是这样的
`C String: 0xcbe9bef070
GoString: eyJ1cmwiOiAiaHR0cHM6Ly9scC5ub...`
但是在delphi中是这样的
`C String: 0x14feb0
Go字符串:`
我还尝试用其他格式而不是 ansi 对我的 delphi 字符串进行编码,但是没有用, 这种行为的原因可能是什么? delphi 和 GO 编码不兼容? obs:我在 windows 虚拟机中运行它,它在 ubuntu 系统上运行