aardio 文档

aardio 范例: 跨语言跨线程回调 消息 _WM_THREAD_CALLBACK

//跨语言跨线程回调
import win.ui;
/*DSG{{*/
var winform = win.form(text="跨语言跨线程回调 消息 _WM_THREAD_CALLBACK";right=599;bottom=399)
winform.add(
edit={cls="edit";left=17;top=22;right=585;bottom=379;edge=1;multiline=1;z=1}
)
/*}}*/

import web.json;
winform.onSendStruct = function(structParam){ 
    winform.edit.print("onSendStruct",structParam);
    structParam.x = 123;

    //可选返回修改后的值
    return structParam; 
}

winform.onSendJson = function(jsonParam){
    winform.edit.print("onSendJson",jsonParam); 

    import ide;
    ide.openDocument("~/example/Languages/Delphi/dll.aardio");
}

thread.invoke( 
    function(hwnd){
        /*
        _WM_THREAD_CALLBACK 使所有回调安全的转发到UI线程。
        _WM_THREAD_CALLBACK 可以跨线程跨编程语言使用。
        */
        var ret,structParam = ::User32.SendMessage( 
            hwnd,0xACCE/*_WM_THREAD_CALLBACK*/, 
            //窗体函数名( 结构体原型声明 ); 结构体原型声明应使用aardio语法 
            "onSendStruct( { int x;int y;int id } )", 
            { int x = 1;int y = 2;id = thread.getId() }
        )


        import web.json;
        ::User32.SendMessage( 
            hwnd,0xACCE/*_WM_THREAD_CALLBACK*/,  
            //如果结构体原型声明为 "{JSON}" 则下一个参数传入JSON文本
            "onSendJson( {JSON} )", 
            //界面线程如果调用了 import web.json,则会自动解析下面的JSON文本,解析结果将作为被调用函数的调用参数
            //json必须使用一个数组包含多个参数
            web.json.stringify( { structParam } )
        )
    },winform.hwnd
) 

/*
//_WM_THREAD_CALLBACK 会将调用窗口函数的返回值转换为数值,无法返回其他值。
//可在下面的事件内拦截调用窗口函数的返回值,并返回新的返回值(仍会转换为数值)。
winform.onThreadCallBackReturn = function(result){
    return result;
}
*/

winform.show();
win.loopMessage();

Markdown 格式