Go1.10在编译成dll小实例

package main

import (
    "net"
)
//必须导入
import "C"

//编译成动态库也是必须的
func main() {}

//export Interfaces
func Interfaces(list []string, retlen *int) string {
    interf, err := net.InterfaceAddrs()
    if err != nil {
        return err.Error()
    }

    for i, v := range interf {
        if i >= len(list) {
            break
        }
        list[i] = v.String()
    }

    *retlen = len(list)
    return ""
}
编译命令:go build -ldflags "-s -w" -buildmode=c-shared -o net.dll main.go
在当前文件夹会生成两个文件net.dll net.h

下面是使用:

#include <stdio.h>
#include<stdlib.h>
#include <string.h>

#include "net.h"

int main()
{ 
    GoString ret;
    GoSlice slice;
    slice.len=10;
    slice.cap=0;
    slice.data=calloc(10,sizeof(GoString));
    GoInt retlen=0;
    ret=Interfaces(slice,&retlen);
    if (ret.n != 0)
    {
        char* retc = calloc(ret.n+1,sizeof(char));
        memcpy(retc,ret.p,ret.n);
        printf("Return value:%s\n", retc); 
        free(retc);
        retc=NULL;
    }

    GoString* st=(GoString*)(slice.data);
    for (int i=0;i<retlen;i++)
    {
        printf("%s\n", st[i].p);
    }

    free(slice.data);
    slice.data=NULL;
    return 0;
}
尽量不要用返回值来在C中处理,因为Go code不能在C分配的内存中存储指向Go分配的内存的指针,这个很重要,不然你就会在使用过程中各种崩溃,

猜你喜欢

转载自blog.csdn.net/fyxichen/article/details/78754687