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分配的内存的指针,这个很重要,不然你就会在使用过程中各种崩溃,
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值