//aardio 调用 Go 语言 - aardio.Call import golang; var go = golang(); go.main = /********** package main import "C" import "aardio" //源文件: ~\lib\golang\.res\aardio\aardio.go //export TestCallBack func TestCallBack(hwnd uintptr){ /* 参数 hwnd 为 aardio 窗口句柄 "onSendJson" 用于指定 aardio 窗口对象成员函数名 可指定不定个数调用参数,细节请参考 golang 扩展库中 aardio.Call 函数源码。 aardio.Call 的原理是发送 _WM_THREAD_CALLBACK 消息给 aardio 窗口, 然后将参数用 JSON 编码发送给 aardio ,aardio 接收到消息后自 JSON 解析获得参数列表, 然后自动转换为函数调用,可选返回数值或 null 值。 这种方法支持跨线程,类似于 RPC 调用(当然速度更快), 没有跨线程的种种限制(不用理会 Go 的 GMP 调度)。 */ aardio.Call(hwnd,"onSendJson","参数1","参数2"); } func main() {} **********/ //上面的 go.main 会自动保存到文件,然后编译 Go 源码生成同名 DLL 文件 go.buildShared("/.go/msgCallback.go"); //------------------下面调用 DLL----------------------- import win.ui; /*DSG{{*/ var winform = win.form(text="Go 使用 aardio.Call 回调 aardio 窗口函数";right=759;bottom=437) winform.add( edit={cls="edit";left=43;top=27;right=717;bottom=400;edge=1;multiline=1;z=1} ) /*}}*/ winform.onSendJson = function(param1,param2){ winform.edit.print("Go 调用了 aardio 函数,参数:",param1,param2) } //加载 Go 编译的 DLL,注意要指定 cdecl 调用约定 var goDll = raw.loadDll("/.go/msgCallback.dll",,"cdecl"); goDll.TestCallBack( winform.hwnd ); winform.show(); win.loopMessage();