我无法将 delphi 字符串作为参数传递给 cgo dll

问题描述 投票:0回答:0

我在 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 系统上运行

go delphi dll virtual-machine c-strings
© www.soinside.com 2019 - 2024. All rights reserved.