你好,使用golang寫動(dòng)態(tài)庫,再使用易語言寫界面,肯定有不少人有這種想法吧;但中間有些坑,這里留下一些解決方法。
從網(wǎng)站建設(shè)到定制行業(yè)解決方案,為提供成都網(wǎng)站建設(shè)、做網(wǎng)站服務(wù)體系,各種行業(yè)企業(yè)客戶提供網(wǎng)站建設(shè)解決方案,助力業(yè)務(wù)快速發(fā)展。成都創(chuàng)新互聯(lián)公司將不斷加快創(chuàng)新步伐,提供優(yōu)質(zhì)的建站服務(wù)。
一、如何編譯?
請先安裝gcc編譯器,選擇32位
由于易語言只支持32位dll,使用64位會(huì)出錯(cuò),例如找不到此函數(shù);
必須先設(shè)置兩項(xiàng)配置:set GOARCH=386,set CGO_ENABLED=1,用cmd;
編譯命令:go build -ldflags "-s -w" -buildmode=c-shared -o dlldemo.dll dlldemo.go 。
二、形參與返回值
在go中,除了 string 特殊外,其他int、bool,等基本類型原本怎樣還是怎樣;
傳 string 與返回值 string 都改成 *C.char 類型,其他基本類型不用改;
有三個(gè)方法比較重要,C.CString 轉(zhuǎn)成c字符串,C.GoString 轉(zhuǎn)成go字符串 , C.free 釋放內(nèi)存;
只要用到 C.CString 此方法,就必須記得釋放內(nèi)存。
三、內(nèi)存泄漏
如果使用了 C.CString 卻不使用 C.free ,內(nèi)存暫用只會(huì)越來越大,最后奔潰;
釋放內(nèi)存時(shí),請不要重復(fù)取地址,例如 unsafe.Pointer(xx變量) ,這樣等于沒釋放;
也可能是vc6的原因,使用 defer 在即將出棧時(shí)釋放,會(huì)造成易語言得不到返回值;
解決方法,聲明全局變量,將結(jié)果賦值給全局變量,專門定義一個(gè)釋放函數(shù)例如FreeAll() 用于釋放!
四、如何調(diào)用
在填寫dll命令時(shí),請?jiān)谔顚?,在庫中對?yīng)命令名時(shí),前面加個(gè) @ ,不然會(huì)出現(xiàn)棧錯(cuò)誤;
每次調(diào)用返回值是文本型dll命令時(shí),請都使用前面準(zhǔn)備的 FreeAll() 釋放內(nèi)存!
通過易語言的便捷,為自己的golang小項(xiàng)目加點(diǎn)gui吧,這里留下源碼,給有需要的人。
希望能幫到你。
.版本 2
.支持庫 HtmlView
.子程序 __啟動(dòng)窗口_位置被改變
.如果真 (_啟動(dòng)窗口.位置 = 3)
超文本瀏覽框1.寬度 = _啟動(dòng)窗口.寬度 - 20
超文本瀏覽框1.高度 = _啟動(dòng)窗口.寬度 - 20
具體寬度 高度 需要看你的 軟件界面布局而定
相信你能搞定了吧
添加聲音資源
.版本?2
.子程序?_按鈕1_被單擊
播放音樂?(#GO,?假)
自繪的皮膚可以換背景?常用的皮膚不能換
.版本 2
.子程序 _按鈕2_被單擊
鳴叫 ()
.子程序 _按鈕3_被單擊
播放音樂 (#聲音1, )
.子程序 _按鈕1_被單擊
播放次數(shù) = 1
' 播放MP3 (, 你想播放的音樂的路徑)
已經(jīng)發(fā)到你的郵箱了!