golang调用c++dll获取mac地址
转自:https://golangtc.com/t/5a0556b34ce40d3bf47f606f 功能: c++实现获取主机的的内存大小,系统用户名,mac地址和硬盘序列号,然后封装成dll给go调用,并提供go调用的接口。github传送门 运行截图:
c++部分: go语言获取mac地址这些不太方便,于是就思考可不可以调用c++封装的dll。这个demo用cgo来实现go对c++代码的调用。其中c++所爆露的接口都是 c++代码:
//simple.cpp"simple.h"){ VolumeInfo[100]; DWORD VolNameSize=;VolSerialNumberVolMaxComponentLengthVolFileSystemFlagsFileSystemNameBufferFileSystemNameSizeGetVolumeInformation("c:"&); sprintf(*number "%d"// return VolSerialNumber;} str1024 DWORD dwsize = GetUserNamestr &dwsize strcpyname ); MEMORYSTATUS stMem {0}; stMem.dwLength sizeofGlobalMemoryStatus(&stMem_size "%d"dwTotalPhys/(*));// return stMem.dwTotalPhys / (1024 * 1024);//有mac地址就返回第一个 , 没有的话就返回空字符串。int i ret unsignedlong size PIP_ADAPTER_INFO pIpAdapterInfo new IP_ADAPTER_INFO();GetAdaptersInfopIpAdapterInfosizeifERROR_BUFFER_OVERFLOW == retdelete pIpAdapterInfo pIpAdapterInfo PIP_ADAPTER_INFO BYTE[} std::string sbool flag falseERROR_SUCCESS if// 每个网卡对应一个链表结点,只要第一个fori <->AddressLength i++)AddressLength-1"%02X-"Addressi]); s +=else"%02X"true//std::cout<<s<<std::endl; NULLflagmacAdress c_str());""} ps:需要注意的是,如果这个代码编译不过,请检查一下你是否缺少了 go部分:我在go调用dll的时候遇到了一个很关于编码的问题,因为go语言的编码格式和c/c++是不同的,所以会出现汉字乱码的情况,这样传系统用户名的时候就麻烦了。通过一下代码发现: //c++ demo[]"连"forstrlenstr printf"%d "]+256); 运行结果为: 193 172。 //go demovar ss "连"data []bytessfmt.Printlndata) 运行结果:[232 191 158 ]。 分析: 可以看到存储汉字的时候c++底层用了两个字节,而go用了三个字节,所以要解决这个问题就要进行编码转换。这里我用到了go中的一个库 go代码:package main */import"fmt""github.com/axgle/mahonia"//用于将gbk编码转化成go的utf-8编码"log""syscall""unsafe"func init() fmt"------------------------------------------" handle err := syscallLoadDLL"Algorithm.dll"!=nilerrError()) logFatal"init() faied." errhandleHandleName"------------函数加载成功------------------"}//返回操作系统当前的用户名func Get_ser_namestring errorFindProc"get_user_name""get_user_name 不存在n"return err str make([]C.charCall((uintptr)(unsafePointer))) data byteGoString])) * 因为c++使用的编码格式与go不相符,会出现中文乱码问题 * 所以要进行转换 */ enc mahoniaNewDecoder"GBK" _ cdata _ encTranslate name cdata[:]) namenil//获得主机内存大小 , 返回stringGet_mem_size"get_mem_size""get_mem_size 不存在"])),0)"> * 获取机器mac地址,如果有多个则返回第一个Get_mac_address"get_mac_address""get_mac_address 不存在"Get_disk_serial_numbere get_disk_serial_num"get_disk_serial_number""get_disk_serial_num 不存在"func main"name(gdk): " size"mems size: " address"address: " disk_number"disk_number: "} ps:还有大家一个问题需要注意,如果go获取dll失败,很可能是因为你的go是64位的而dll是32位的。大家可以直接用我上面的c++代码编译成dll文件给go用,也可以用我已经编译好的dll用。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |