在golang中加載dll并調(diào)用函數(shù)流程如下:
“只有客戶發(fā)展了,才有我們的生存與發(fā)展!”這是成都創(chuàng)新互聯(lián)的服務(wù)宗旨!把網(wǎng)站當(dāng)作互聯(lián)網(wǎng)產(chǎn)品,產(chǎn)品思維更注重全局思維、需求分析和迭代思維,在網(wǎng)站建設(shè)中就是為了建設(shè)一個(gè)不僅審美在線,而且實(shí)用性極高的網(wǎng)站。創(chuàng)新互聯(lián)對(duì)成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)站開(kāi)發(fā)、網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站優(yōu)化、網(wǎng)絡(luò)推廣、探索永無(wú)止境。
1.加載dll動(dòng)態(tài)庫(kù)到內(nèi)存 syscall.LoadLibrary
2.獲取函數(shù)地址 syscall.GetProcAddress
3.執(zhí)行系統(tǒng)調(diào)用,傳入?yún)?shù) syscall.Syscall6
一個(gè)系統(tǒng)消息框函數(shù)的調(diào)用示例:
第一次開(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)?,goland在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è)置。所以如果使用命令行編譯,可以寫一個(gè)bat文件,每次都自動(dòng)先把環(huán)境設(shè)置好。
GO語(yǔ)言包估計(jì)能直接調(diào)用我沒(méi)試
編譯DLL庫(kù)絕調(diào)用或者直接直接用系統(tǒng)命令調(diào)用編譯完執(zhí)行程序
關(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ù)組。 由于樓...
肯定不行。文件格式不一樣,封裝的系統(tǒng)函數(shù)也不一樣。怎么跑?除非虛擬機(jī)。