参考:http://www.voidcn.com/article/p-ofnbgvoa-bpv.html
c++:
MYLIBDLL char* testchar(int plus1);
MYLIBDLL void greet(char *name);
void greet(char *name)
{
printf("Hello, %s!\n", name);
}
char* testchar(int plus1) {
char* str = "hello world111111";
return str;
}
main.go代码:
package main
import (
"syscall"
"unsafe"
"fmt"
)
import "C"
func callDll() {
dll := syscall.MustLoadDLL("hik_client.dll")
procGreet := dll.MustFindProc("greet")
procGreet.Call(uintptr(unsafe.Pointer(syscall.StringBytePtr("Cynhard11"))))
procName := dll.MustFindProc("testchar")
r, _, _ := procName.Call(1)
// 获取C返回的指针。
// 注意C返回的r为char*,对应的Go类型为*byte
p := (*byte)(unsafe.Pointer(r))
// 定义一个[]byte切片,用来存储C返回的字符串
data := make([]byte, 0)
// 遍历C返回的char指针,直到 '\0' 为止
for *p != 0 {
data = append(data, *p) // 将得到的byte追加到末尾
r += unsafe.Sizeof(byte(0)) // 移动指针,指向下一个char
p = (*byte)(unsafe.Pointer(r)) // 获取指针的值,此时指针已经指向下一个char
}
name := string(data) // 将data转换为字符串
fmt.Printf("Hello, %s!\n", name)
//var a = make([]byte, 256)
//
//
//dll32 := syscall.NewLazyDLL("hik_client.dll")
//fmt.Println("call dll:", dll32.Name)
//GetPeopleName := dll32.NewProc("testchar")
//
//ret,_,err := GetPeopleName.Call(uintptr(unsafe.Pointer(&a)),2)
//if err != nil {
// fmt.Println(ret,a)
// aaa := C.GoString(ret)
// //C.free(unsafe.Pointer(cs))
// //C.free(unsafe.Pointer(result))
// //fmt.Println(aaa,a)
//}
//result, a, _ := g.Call(4)
//fmt.Println("result is :", ret)
}
func main() {
fmt.Println("start111111111!")
callDll()
//fmt.Println(C.add(2, 1))
}