真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Go語(yǔ)言編譯成dll,go語(yǔ)言編譯成exe

如何在Go語(yǔ)言中調(diào)用DLL

關(guān)鍵是 lpOnRecvCardEvent 這個(gè)函數(shù)的第二個(gè)參數(shù)是個(gè) C++ 指針。 樓主在 C# 中聲明這個(gè)導(dǎo)出函數(shù)時(shí),使用了并不對(duì)應(yīng)的 CardEvent[] C# 數(shù)組類型。 正確的做法是: 在 C# 聲明 lpOnRecvCardEvent 時(shí),第二個(gè)參數(shù)應(yīng)該是 IntPtr ,不是數(shù)組。 由于樓...

專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)輝縣免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千余家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

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

GO語(yǔ)言的包估計(jì)是不能直接調(diào)用的,這個(gè)我沒(méi)試過(guò)。不過(guò)編譯成DLL的庫(kù)絕對(duì)是可以調(diào)用的,或者直接直接用系統(tǒng)命令調(diào)用編譯完成的可執(zhí)行程序。

如何編譯生成dll

使用VC下的cl和link手工創(chuàng)建dll并實(shí)現(xiàn)函數(shù)導(dǎo)入

1、創(chuàng)建dll頭文件:

/*

* dllmain.h

*/

#ifndef _DLLMAIN_H

#define _DLLMAIN_H

int getNumber();

#endif

2、創(chuàng)建dll源文件:

/*

* dllmain.c

*/

#include "dllmain.h"

int getNumber()

{

return 10;

}

3、 創(chuàng)建def文件:

; export.def

LIBRARY MY_DLLMAIN ; MY_DLLMAIN 將成為生成的dll的名稱

EXPORTS

getNumber @1 ; 這個(gè)名稱即為函數(shù)的實(shí)際導(dǎo)出名稱 @1為函數(shù)的導(dǎo)出編號(hào)

4、生成dll文件:

cl dllmain.c /c

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

這時(shí),工程中已經(jīng)包含了 dllmain.h dllmain.c export.def dllmain.obj dllmain.lib dllmain.exp MY_DLLMAIN.dll 其中,后4個(gè)文件是編譯鏈接過(guò)程中生成的文件

5、創(chuàng)建dlltest.c:

/*

* dlltest.c

*/

#include stdio.h

#include "dllmain.h" //dll庫(kù)的頭文件

#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應(yīng)該和dlltest.c在同一個(gè)目錄中。此步的結(jié)果將生成 dlltest.exe

7、運(yùn)行:

dlltest

這時(shí),系統(tǒng)將載入my_dllmain.dll這個(gè)動(dòng)態(tài)鏈接庫(kù),將調(diào)用其中的getNubmer函數(shù)。

如何使用go調(diào)用dll函數(shù)

和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] }

然后就可以調(diào)用了。

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

請(qǐng)不要傳空值,可以用空格代替之。

最后實(shí)例代碼,補(bǔ)充完成

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遇到的問(wèn)題

第一次開(kāi)發(fā)Go程序,使用Goland過(guò)程中遇到的一些問(wèn)題,開(kāi)發(fā)的Go后臺(tái)需要使用到Windows的一個(gè)32位DLL動(dòng)態(tài)庫(kù),此為原由,整個(gè)過(guò)程如下。

在按照上述方式配置好環(huán)境,并嘗試使用CGO加載DLL時(shí),執(zhí)行GOLAND的DEBUG提示如下。

經(jīng)過(guò)搜索猜測(cè),是目標(biāo)機(jī)器架構(gòu)選擇錯(cuò)誤導(dǎo)致的。

但是在環(huán)境配置中,已經(jīng)正確的選擇了Arch為386,嘗試使用liteIDE或者直接使用命令行編譯,都能夠正常編譯。唯獨(dú)使用GoLand不行。

看現(xiàn)象應(yīng)該是設(shè)置沒(méi)有生效,最后嘗試在Run/Debug Configurations再次設(shè)置Go env解決此問(wèn)題。步驟如下:

再次點(diǎn)擊debug,發(fā)現(xiàn)debug失敗,提示如下內(nèi)容。

這是因?yàn)椋琯oland在debug時(shí)使用的是dlv插件,該插件還不支持32位程序的調(diào)試,直接執(zhí)行run就可以了。

在使用命令行編譯go程序時(shí),可以使用go env命令查看當(dāng)前編譯環(huán)境設(shè)置。

假如需要修改 GOARCH為386,繼續(xù)輸入命令行 set GOARCH=386 即可,如果重新打開(kāi)cmd終端,則需要重新設(shè)置。所以如果使用命令行編譯,可以寫(xiě)一個(gè)bat文件,每次都自動(dòng)先把環(huán)境設(shè)置好。


本文名稱:Go語(yǔ)言編譯成dll,go語(yǔ)言編譯成exe
轉(zhuǎn)載來(lái)于:http://weahome.cn/article/dsicoge.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部