易语言界面库的实现(一)
扫描二维码
随时随地手机看文章
易语言IDE自带了界面库,是通过“支持库(DLL)”来提供的。脱离这些库,你想写自己的界面程序? 易毕竟不是C。没有Win32 SDK 。从常量到API声明。光这些工作就能把你累个差不多。
以前也写过一个界面库。不过自己不是很满意。易语言写界面库。首要考虑的是效率问题。当然可以用内联汇编。不过易语言的内联汇编只能是置入机器码。因为填入的是机器码,当然不能链接,因此不能访问全局变量。也不能访问外部函数,包括用汇编调用API。巨麻烦!因此,填入的机器码最多也就能访问局部变量和传递进来的参数。
写界面库。第一步自然是消息映射了。首先得感谢“吴涛”提供了置入代码() 这么一个方便的函数。要查看易语言的一条语句的汇编代码。
如上图,在一天语句前后分辨置入代码 {204} 204 就是 int 3 然后编译成可执行文件。运行。等待它崩溃(其实不是崩溃 Int 3 实际上是中断。程序运行到这条指令会暂停。)再选择VC调试。呵呵。
0040336F int 3 00403370 push 0CD0490h 00403375 push dword ptr [ebp+8] 00403378 call 00403363 0040337D int 3
就这么简单,呵呵…… 两个 Int 3 就是我所置入的 代码 204 中间的就是调用一个对象的基类方法的过程。 第一个Push 是压入全局变量 arg 第二个 push 是压入PThis 因为是调用基类的方法。所以直接Call了一个立即数 就是vvv.basgmethod 的入口地址了。
通过这些方法。要了解易语言的对象的内存结构。就不难了。因为界面库大多是效率要求比较高的地方。用丁点儿汇编也是没办法的事。
先说一下易语言本身的限制。易语言可以获取子程序地址 用& 带程序名获取。但无法获取类方法的地址。 还好我要获取的不多。只要知道易的虚表。然后根据自己写的方法的索引找到它Call 一下就可以了。
界面库要实现消息映射,第一步就是将窗口句柄和窗口对象进行绑定。在这里我采用了 钩子的办法。WH_CBT钩子可以干这事。在 HCBT_CREATEWND 用窗口句柄当作 key 对象指针当作 值。保存到一个哈希表中。接下来就是子类化窗口了。写一个自己的窗口过程,在这里调用类里的窗口过程方法。(这里又要用到汇编了,原因是:哈希表里存的是对象指针 在易语言里是一个整数)。拿到这个整数。还要调用对象的方法。自然是只能用汇编了。
现在每个窗口一个对象。每个对象有自己的窗口过程。在对象内部处理窗口消息。方便多了。而且可以更方便地实现消息映射。