關(guān)鍵是 lpOnRecvCardEvent 這個函數(shù)的第二個參數(shù)是個 C++ 指針。 樓主在 C# 中聲明這個導(dǎo)出函數(shù)時,使用了并不對應(yīng)的 CardEvent[] C# 數(shù)組類型。 正確的做法是: 在 C# 聲明 lpOnRecvCardEvent 時,第二個參數(shù)應(yīng)該是 IntPtr ,不是數(shù)組。 由于樓...
專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計、做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)輝縣免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上千余家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
GO語言的包估計是不能直接調(diào)用的,這個我沒試過。不過編譯成DLL的庫絕對是可以調(diào)用的,或者直接直接用系統(tǒng)命令調(diào)用編譯完成的可執(zhí)行程序。
使用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 ; 這個名稱即為函數(shù)的實(shí)際導(dǎo)出名稱 @1為函數(shù)的導(dǎo)出編號
4、生成dll文件:
cl dllmain.c /c
link /def:export.def /dll dllmain.obj
這時,工程中已經(jīng)包含了 dllmain.h dllmain.c export.def dllmain.obj dllmain.lib dllmain.exp MY_DLLMAIN.dll 其中,后4個文件是編譯鏈接過程中生成的文件
5、創(chuàng)建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應(yīng)該和dlltest.c在同一個目錄中。此步的結(jié)果將生成 dlltest.exe
7、運(yùn)行:
dlltest
這時,系統(tǒng)將載入my_dllmain.dll這個動態(tài)鏈接庫,將調(diào)用其中的getNubmer函數(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))));
請不要傳空值,可以用空格代替之。
最后實(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))));
第一次開發(fā)Go程序,使用Goland過程中遇到的一些問題,開發(fā)的Go后臺需要使用到Windows的一個32位DLL動態(tài)庫,此為原由,整個過程如下。
在按照上述方式配置好環(huán)境,并嘗試使用CGO加載DLL時,執(zhí)行GOLAND的DEBUG提示如下。
經(jīng)過搜索猜測,是目標(biāo)機(jī)器架構(gòu)選擇錯誤導(dǎo)致的。
但是在環(huán)境配置中,已經(jīng)正確的選擇了Arch為386,嘗試使用liteIDE或者直接使用命令行編譯,都能夠正常編譯。唯獨(dú)使用GoLand不行。
看現(xiàn)象應(yīng)該是設(shè)置沒有生效,最后嘗試在Run/Debug Configurations再次設(shè)置Go env解決此問題。步驟如下:
再次點(diǎn)擊debug,發(fā)現(xiàn)debug失敗,提示如下內(nèi)容。
這是因為,goland在debug時使用的是dlv插件,該插件還不支持32位程序的調(diào)試,直接執(zhí)行run就可以了。
在使用命令行編譯go程序時,可以使用go env命令查看當(dāng)前編譯環(huán)境設(shè)置。
假如需要修改 GOARCH為386,繼續(xù)輸入命令行 set GOARCH=386 即可,如果重新打開cmd終端,則需要重新設(shè)置。所以如果使用命令行編譯,可以寫一個bat文件,每次都自動先把環(huán)境設(shè)置好。
分享題目:Go語言編譯成dll,go語言編譯成exe
URL地址:http://chinadenli.net/article14/dsicoge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計、品牌網(wǎng)站建設(shè)、服務(wù)器托管、云服務(wù)器、網(wǎng)站營銷、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)