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库)

