在封装dll时,通常会定义一个类,用来定义dll的各种功能。
如果在类里出现 大量的、模式一样的 属性或函数(方法),如果一个一个去定义,会感觉很累。
这里介绍一种简单方法,可以批量进行定义。
1、先用 ..util.metaProperty() 初始化一下属性表模板,
2、定义属性“表”,利用循环进行批量设置
3、如果属性为文本型,定义时在函数前加/标记
这得益于aardio灵活的属性定义功能和强大的util.metaProperty库。
// 定义属性表模板
elistbar._metaProperty = ..util.metaProperty()
// 定义属性名称“表”
var props = { "Visible","Disable","MousePointer","BackColor","RangeStyle",
"/FolderFontName","/ItemFontName","/ImgFileName"}
// 批量进行属性表处理
for(i=1;#props;1){
var isText = ..string.startWith(props[i],"/") // 返回值是否为文本型
var propName = ..string.trimleft(props[i],"/") // 取函数名称
elistbar._metaProperty[propName] = {
_set = function(v){
if isText v = ..string.fromto(v:"");
owner.dll.setProp(owner.tag,propName,v);
};
_get = function(){
var rv = owner.dll.getProp(owner.tag,propName);
if isText rv = ..string.fromto(..raw.tostring(topointer(rv)),0,65001);
return rv;
};
};
}
对于一般的dll函数,参数和返回值的类型最常用的为数值型、逻辑型、文本型(字符串),对于自定义结构型,会返回指针(数值型)。
通常数值型、逻辑型、文本型三个类型就基本能满足需要。
在类构造函数 ctor 中,可以批量定义dll的函数。
这得益于aardio强大的不声明直接调用API的功能。
// 批量定义函数
// 返回值通常为数值型、布尔型、null
// 如果返回值为文本型,定义时在函数前加/标记
// 先定义一个函数表
var funcs = {"setChecked","getChecked","setCaret","/getText","/getTitle"}
// 将函数表中的每个函数进行定义
for(i=1;#funcs;1){
var isText = ..string.startWith(funcs[i],"/") // 返回值是否为文本型
var funcName = ..string.trimleft(funcs[i],"/") // 取函数名称
this[funcName] = function(...){
// 构造参数表
var tb = {...}
// 如果dll采用ansi编码,便将参数中的字符串转码一下
for(n=1;#tb;1){
if type(tb[n])=type.string{
tb[n]=..string.fromto(tb[n]);
}
}
// 获取返回值
var rv = this.dll[funcs[i]](this.tag,..table.unpack(tb));
// 如果返回值是文本型,就将其ansi转utf8
if isText rv = ..string.fromto(..raw.tostring(topointer(rv)),0,65001);
return rv;
}
}