- 调用动态库
涉及点:C 二级指针,函数内动态申请内存、Go <=> C 字符串互转
/**
* extern int read_key(unsigned char **data, char *licence, char msg[]);
* extert void free_data(unsigned char **data);
* char *data, *licence = "", msg[1024];
* => int ret = (&data, licence, msg);
* => free_data(&data); // data 函数内动态申请内存,需要手动释放
*/
package main
/*
#cgo CFLAGS: -I../include
#cgo LDFLAGS: -L../lib -lukey -lcrypto -lxml2
#include "ukey.h"
*/
import "C"
import (
"fmt"
"unsafe"
)
func main() {
var cdata *C.uchar
msg := (*C.char)(C.malloc(C.sizeof_char * C.size_t(1024)))
clicence := C.CString("yGdsldNagahcc8923cHbygcbhw3gycEiunjvbwgyf2b3fB2jhFvbh23b")
ret := C.read_key(&cdata, clicence, msg)
if ret < 0 {
fmt.Println(C.GoString((*C.char)(unsafe.Pointer(msg))))
return
}
data := C.GoString((*C.char)(unsafe.Pointer(cdata)))
C.free_data(&cdata)
fmt.Println(data)
// TODO: something
}