|
1,使用指针
易语言中出于安全、方便考虑,没有直接提供指针,这在进行一些高级操作时不是很方便,虽然有一些第三方支持库可以取出变量指针(比如我的eLib++ 注:该支持库系Delphi开发,本人已开放源代码,你可以到易语言下载区看看)但是仅仅为了这个操作就带上一个支持库不太值得。其实用一个API,加上一些技巧就可以欺骗windows和易语言,让它们告诉你一个变量的指针。
这个API是lstrcpyn。用过C开发Windows下的程序的朋友可能对这个API比较熟悉,就是字符串拷贝。在windows下取代C标准库函数strncpy的。字符串拷贝怎么能取得变量指针呢?秘密就在这个API的返回值:
看看MSDN:“If the function succeeds, the return value is a pointer to the buffer”
该函数把第二个参数指定的字符串复制到第一个参数指定的字符串,第三个参数指定复制的长度。如果复制成功,返回第一个参数(缓冲区buffer)的地址。看到了吗?它返回第一个参数的地址!!那么我们把需要取地址的变量给它的第一个参数,然后想办法让它复制成功,它不就返回了那个变量的地址了吗?
定义一个DLL命令如下:
Dll命令:取文本指针
返回值类型:整数型
在Dll库中的命令名:lstrcpyn
参数:欲取其指针的文本 数据类型:文本型 <传址>
参数:欲取其指针的文本 数据类型:文本型 <传址>
参数:保留 数据类型:整数型 备注:0
这样调用:
文本1 = “abcdefg”
指针1 = 取文本指针 (文本1, 文本1, 0)
把文本1复制到自身,复制长度为0字节(也就是什么都不复制),然后返回文本1的指针。就这么简单。先告诉windows我要复制一个文本到某个内存地址,但同时告诉它我什么都不复制,它实际上帮你取出了这个文本的指针。
上面的例子是取文本的指针,其他类型的变量也一样的,因为在API内部(其实是在内存中)什么类型的变量都表现为一块内存区域,原理是一样的。但是易语言是强制类型的语言,所以这次要骗骗易语言了,呵呵,再定义这个API的一个新版本,把它的参数定义成你想要的类型就可以了。
Dll命令:取整数指针
返回值类型:整数型
在Dll库中的命令名:lstrcpyn
参数:欲取其指针的整数 数据类型:整数型 <传址> 备注:一定要传址
参数:欲取其指针的整数 数据类型:整数型 <传址> 备注:一定要传址.重复一次
参数:保留 数据类型:整数型 备注:0
2,特殊的结构用字节集代替
Window98及其后的操作系统提供了一个非常棒的API :GradientFill,利用这个API可以方便地画出渐变的效果。
这个API倒不是很麻烦,参考MSDN我们很快就可以在易语言中定义出这个DLL命令:(以渐变填充矩形为例)
Dll命令:GradientFill
返回值类型:逻辑型
Dll库文件名:Msimg32.dll
在Dll库中的命令名:GradientFill
参数:hDC 数据类型:整数型
参数:pVertex 数据类型:TRIVERTEX
参数:dwNumVertex 数据类型:整数型
参数:pMesh 数据类型:GRADIENT_RECT
参数:dwNumMesh 数据类型:整数型
参数:dwMode 数据类型:整数型 |
|