文字大小:

xlang 4.0 更新信息

更新信息2023-12-23 08:25:31




  此次同步发布了 xlang 4.0, 该版本经过几年的在各种领域的开发并完善,目前已用于商业软件开发,并表明 xlang 语言对于开发PC软件具有较突出的优势,尤其在设计APP大框架方面,xlang目前没有jit,但可以通过与 C/C++ 模块的交互实现某些极端的性能需求(虽然这种需求在现有的APP开发中几乎很少见)。

  该版本进一步优化,增强了性能和健壮性,并新增了数十种新指令来改善以适应需求。

 

  在与C/C++等native模块交互上,xlang 4.0 新增了动态对象本地化功能,可以将xlang代码中的类、变量以及方法进行 native 化,以方便与 C/C++ 等模块进行交互,以win32项目为例(见XStudio项目示例):

//windef.x 
/*** 注解@Native 向编译器标明该类需要本地化 ,该对象对应C/C++ 中的接口构体 WNDCLASSEXA 
typedef struct tagWNDCLASSEXA {
    UINT        cbSize;
    UINT        style;
    WNDPROC     lpfnWndProc;
    int         cbClsExtra;
    int         cbWndExtra;
    HINSTANCE   hInstance;
    HICON       hIcon;
    HCURSOR     hCursor;
    HBRUSH      hbrBackground;
    LPCSTR      lpszMenuName;
    LPCSTR      lpszClassName;
    HICON       hIconSm;
} WNDCLASSEXA, *PWNDCLASSEXA, NEAR *NPWNDCLASSEXA, FAR *LPWNDCLASSEXA;
****/
@Native //默认没有对齐参数  如需按照n对齐 需要加(Align = n)
class WNDCLASSEXA {
    // 该对象中需要native的对象都需要加@Native 注解
    // Pointer 是指针类型对象, 它在32位和64位下的长度不一样,它可以直接与long类型进行交互, 但编译器不会将它作为数值型与int等隐式转换
    @Native public int cbSize = sizeof(WNDCLASSEXA);  // sizeof 方法用来返回该对象native后的大小 单位为字节
    @Native public int style;
    @Native public Pointer lpfnWndProc;
    @Native public int cbClsExtra;
    @Native public int cbWndExtra;
    @Native public Pointer hInstance;
    @Native public Pointer hIcon;
    @Native public Pointer hCursor;
    @Native public Pointer hbrBackground = WinApi.GetStockObject(BLACK_BRUSH);
    @Native public String lpszMenuName;
    @Native public String lpszClassName;
    /* Win 4.0 */
    @Native public Pointer hIconSm;
    
    public void setStyle(int s) {
        style = s;
    }
    public void setProc(Method p) {
        lpfnWndProc = p.toNative();
    }
    public void setClassName(String s) {
        lpszClassName = s;
    }
    public String getClassName() {
        return lpszClassName; 
    }
};

 // 导入user32模块的方法
 public import "user32" {
    short stdcall RegisterClassExA(ObjectPtr wcx);//ObjectPtr 类型参数表示对参数的对象取地址
    Pointer stdcall DefWindowProcA(Pointer hwnd, int msg, Pointer wparam, Pointer lparam);
 }


    /**
     给native使用的回调函数, 从C/C++里面回调上来的,需要加native注解, 并标明调用约定是stdcall
    **/
    @Native(CallConvention = "stdcall")
    public static Pointer WndProc(Pointer hWnd, int message, Pointer wParam, Pointer lParam) {
// 创建画刷 静态变量只会初始化一次
        switch(message) {
// 收到 WM_DESTROY
        case WM_DESTROY:
            WinApi.PostQuitMessage(0);
            return 0l; // 注意 Pointer 和 整数类型无法自动转换, 要手动写成long的形式 即字面量后面加上l(小写L)
            break;
        }

        return WinApi.DefWindowProcA(hWnd, message, wParam, lParam);
    }

  //用法 
  WNDCLASSEXA wcex = new WNDCLASSEXA();

  wcex.setStyle(3);
// 设置回调函数
  wcex.setProc(WndProc);
// 设置窗口类名
  wcex.setClassName(WndClassName);
// 注册窗口类
  short n = WinApi.RegisterClassExA(wcex); //将该对象实例用作参数 

该实例代码中将WNDCLASSEXA 类进行本地化并提供给Windows Api  RegisterClassExA 进行调用。

 

 






上一篇:XStudio2.0 新增功能下一篇:XStudio for stm32 (带标准库和HAL库)

评论

写评论

点击刷新