Go语言编译成dll,go语言编译成exe

如何在Go语言中调用DLL

关键是 lpOnRecvCardEvent 这个函数的第二个参数是个 C++ 指针。 楼主在 C# 中声明这个导出函数时,使用了并不对应的 CardEvent[] C# 数组类型。 正确的做法是: 在 C# 声明 lpOnRecvCardEvent 时,第二个参数应该是 IntPtr ,不是数组。 由于楼...

专注于为中小企业提供成都网站设计、做网站服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业辉县免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了上千余家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

如何方便的一次更新golang的所有第三方包

GO语言的包估计是不能直接调用的,这个我没试过。不过编译成DLL的库绝对是可以调用的,或者直接直接用系统命令调用编译完成的可执行程序。

如何编译生成dll

使用VC下的cl和link手工创建dll并实现函数导入

1、创建dll头文件:

/*

* dllmain.h

*/

#ifndef _DLLMAIN_H

#define _DLLMAIN_H

int getNumber();

#endif

2、创建dll源文件:

/*

* dllmain.c

*/

#include "dllmain.h"

int getNumber()

{

return 10;

}

3、 创建def文件:

; export.def

LIBRARY MY_DLLMAIN ; MY_DLLMAIN 将成为生成的dll的名称

EXPORTS

getNumber @1 ; 这个名称即为函数的实际导出名称 @1为函数的导出编号

4、生成dll文件:

cl dllmain.c /c

link /def:export.def /dll dllmain.obj

这时,工程中已经包含了 dllmain.h dllmain.c export.def dllmain.obj dllmain.lib dllmain.exp MY_DLLMAIN.dll 其中,后4个文件是编译链接过程中生成的文件

5、创建dlltest.c:

/*

* dlltest.c

*/

#include stdio.h

#include "dllmain.h" //dll库的头文件

#pragma comment(lib,"dllmain.lib") //dllmain.lib即是上一步生成的文件

int main()

{

printf("%dn",getNumber());

}

6、编译、链接dlltest.c

cl dlltest.c /c

link dlltest.obj

注意:这里dllmain.lib和dllmain.h应该和dlltest.c在同一个目录中。此步的结果将生成 dlltest.exe

7、运行:

dlltest

这时,系统将载入my_dllmain.dll这个动态链接库,将调用其中的getNubmer函数。

如何使用go调用dll函数

和golang代码一样,照抄,但得换成byte类型即可。

func INT8FromString(s string) ([]byte, error) {for i := 0; i len(s); i++ { if s[i] == 0 { return nil, nil }}return []byte(s), nil}func StringToINT8(s string) []byte {a, err := INT8FromString(s)if err != nil { panic("syscall: string with NUL passed to StringToINT8")}return a}func StringToINT8Ptr(s string) *byte { return StringToINT8(s)[0] }

然后就可以调用了。

retGet, getproc, geterr := g1.Call( uintptr(ret), uintptr(unsafe.Pointer(buffer[0])), uintptr(1024), uintptr(unsafe.Pointer(StringToINT8Ptr(items))));

请不要传空值,可以用空格代替之。

最后实例代码,补充完成

items := "string...."; // 字符 类似 *charbuffer := make([]byte, 1024) // 指针位置retGet, getproc, geterr := g1.Call( uintptr(ret), uintptr(unsafe.Pointer(buffer[0])), uintptr(1024), uintptr(unsafe.Pointer(StringToINT8Ptr(items))));

goland,cgo加载32位DLL遇到的问题

第一次开发Go程序,使用Goland过程中遇到的一些问题,开发的Go后台需要使用到Windows的一个32位DLL动态库,此为原由,整个过程如下。

在按照上述方式配置好环境,并尝试使用CGO加载DLL时,执行GOLAND的DEBUG提示如下。

经过搜索猜测,是目标机器架构选择错误导致的。

但是在环境配置中,已经正确的选择了Arch为386,尝试使用liteIDE或者直接使用命令行编译,都能够正常编译。唯独使用GoLand不行。

看现象应该是设置没有生效,最后尝试在Run/Debug Configurations再次设置Go env解决此问题。步骤如下:

再次点击debug,发现debug失败,提示如下内容。

这是因为,goland在debug时使用的是dlv插件,该插件还不支持32位程序的调试,直接执行run就可以了。

在使用命令行编译go程序时,可以使用go env命令查看当前编译环境设置。

假如需要修改 GOARCH为386,继续输入命令行 set GOARCH=386 即可,如果重新打开cmd终端,则需要重新设置。所以如果使用命令行编译,可以写一个bat文件,每次都自动先把环境设置好。


本文题目:Go语言编译成dll,go语言编译成exe
URL分享:http://ybzwz.com/article/dsicoge.html