马上加入TC
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 类人猿 于 2017-8-28 14:13 编辑
<<<<<<<<技术探讨,欢迎大神指导!<<<<技术Q:578052137 技术群:128262077
下面dllcall使用在TC官方帮助文件里面也有的,我这里还是整理出来希望大家能重视这个功能使用,希望对你有所帮助。重点/难点是:
1.参数类型理解,可以参考我之前的帖子
2.ASCII编码的字符串和Unicode编码
3.传值和传值、
4.回调函数
dllcall是TC4.0版本以后的一个全新功能,也是TC的一个做为脚本开发工具一个非常有特色的功能,意味着TC功能的实现将不再局限于自带的函数功能与第三方的com插件的调用,与系统的功能结合更加紧密,能自主开发出更加强大的功能
TC5.0版本对dllcall的功能做了一次重大的扩展,让dllcall支持结构体,支持传址.有了这些功能,系统api将能够在TC中得到更加广泛的应用
dllcall参数说明
函数原型:dllcall(filepath,type,functionName,...)
filepath:api所在的一个dll的地址
type:api返回值的类型
functionName:api的名字,某些字符串相关的API在名字需要多加字母A或者W
...:表示参数是动态的,后面的实际参数是根据API的具体参数来写的
dllcall使用规则:
1、调用系统API只需要写API所在的dll就可以了,可以不写绝对路径,自己编写的API必须使用绝对路径
2、dllcall的参数在TC里面的定义:win32api的普通参数分为两类,一类普通传参只需要普通类型就可以了,另一类需要使用传址,例如像GetModuleFileNameW,这个时候就需要使用我们下列以p开头的类型
简单理解就是需要传址的参数,需要使用p开头的类型才可以
在MSDN中,在参数前面会有_In_ 与 _Out_ 两类标识符来区分,参数是传入,还是按址传出
TC参数 | WIN32中的参数类型 | 说明 | wchar *
pwchar * | LPCWSTR,LPWSTR,LPCWCH等等 | 在WIN32中 带字符串操作的的函数都会区分 A/W两类函数,分别表示支持ASCII编码还是UNOICDE编码
wchar * 表示UNIOCDE编码的字符串,对应WIN32函数中以W尾的函数,例如MessageBoxW
同时TC内部对于字符处理都是使用的UNICODE编码,所以推荐大家使用dllcall尽量使用W类的函数,
效率会适当的提升
pwchar * 表示的是传址,就是说函数的字符串要通过参数返回到TC里面来,在WIN32里面,有许多获
取字符信息的函数需要这样操作 例如GetModuleFileNameW | char *
pchar * | LPCSTR,LPSTR,LPCCH等等 | 在WIN32中 带字符串操作的的函数都会区分 A/W两类函数,分别表示支持ASCII编码还是UNOICDE编码
char * 表示ASCII编码的字符串,对应WIN32函数中以A尾的函数,例如MessageBoxA
同时TC内部对于字符处理都是使用的UNICODE编码,使用A类字符串相关函数,内部会做一层转换,所以不推荐大家频繁使用,会影响部分效率
pchar * 表示的是传址,就是说函数的字符串要通过参数返回到TC里面来,在WIN32里面,有许多获
取字符信息的函数需要这样操作 例如GetModuleFileNameA | double
pdouble | double,DOUBLE
| _In_ double,占位8字节,双精度浮点数
_Out_ pdouble,双精浮点型数用引用传址 | float
pfloat | float,FLOAT
| _In_ float,占位4字节,单精度浮点数
_Out_ pfloat,单精浮点型数用引用传址 | long
plong | long,LONG,DWORD
PWORD,LPWORD,PINT,LPINT | _In_ long,占位4字节,在TC的应用中最为广泛,他不仅仅只能表示数值类型,他还可以表示指针(指针说法比较复杂放在实例中讲解)
_Out_ plong,整型数用引用传址,应用场景,例如:GetWindowThreadProcessId | longlong
plonglong
| long long,LONGLONG | _In_ longlong,占位8字节,某些特殊的api需要应用到长整型,例如StrFormatByteSizeW
_Out_ plonglong,此类型暂时预留不支持使用 | short
pshort | short,SHORT,WORD
PWORD,LPWORD | _In_ short,占位2字节,以无符号形式展示0-65535之间
_Out_ pshort,短型数用引用传址 | byte
pbyte | char,CHAR,UCHAR,,byte,BYTE
PBYTE,LPBYTE | _In_ byte,占位1字节,以无符号形式展示 0-255之间
_Out_ pbyte,字节用引用传址 | struct
pstruct | WIN中的结构体
对应结构体的地址 | _In_ struct 普通参数的形式传入函数 应用场景,如:WindowFromPoint
_Out_ pstruct,结构体内部成员需要被函数修改,其实传入的是结构体指针,应用场景,如:GetCursorPos | callback | 回调函数地址 | 回调函数,对应win32中各种回调函数的函数地址,通过callbackmalloc申请,不使用时需使用callbackfree释放 |
常规类型请按上面请对号入座,如果没有按照对应类型,TC会在内部自动当成 long型处理,某些时间就会引起一莫名期妙的崩溃,所以大家在使用dllcall的时候一定要注意自己的类型
3、参数的个数以及类型必要与MSDN上相对应
4、结构体的使用,结构体与普通类型一样,但是不支持以p开头的类型,结构体支持的类型列表如下:
TC参数 | WIN32中的参数类型 | 说明 | wchar
| wchar,WCHAR | 在WIN32中 带字符操作的结构体也是区分 A/W两类函数,分别表示支持ASCII编码还是UNOICDE编码
wchar 表示UNICODE编码的字符串
在结构体中出现wchar一般都会被指定缓存长度大小 | char | char,CHAR | 在WIN32中 带字符操作的结构体也是区分 A/W两类函数,分别表示支持ASCII编码还是UNOICDE编码
char 表示ASCII编码的字符串
在结构体中出现char一般都会被指定缓存长度大小 | double
| double,DOUBLE
| double,占位8字节,双精度浮点数 | long
| long,LONG,DWORD
| long,占位4字节,在TC的应用中最为广泛,他不仅仅只能表示数值类型,他还可以表示指针(指针说法比较复杂放在实例中讲解)
| longlong
| long long,LONGLONG | longlong,占位8字节,某些特殊的api需要 | short | short,SHORT,WORD | short,占位2字节,以无符号形式展示0-65535之间 | byte | char,CHAR,UCHAR,,byte,BYTE | byte,占位1字节,以无符号形式展示 0-255之间 | struct
pstruct | WIN中的结构体
对应结构体的地址 | struct 当结构体出现嵌套的时候,需要指定为此类型
pstruct,某些情况下,结构体里面需要指向另外一个新的结构体那么,就需要用的此种类型,但是结构体指针都是由整型数值来表示 | callback | 回调函数地址 | 回调函数,结构体中也不例外,同样也是会存在此种类型,对应win32中各种回调函数的函数地址,通过callbackmalloc申请,不使用时需使用callbackfree释放 |
5、结构体定义与使用,更多使用介绍请参考论坛
- //------结构体类型定义------
- var point = array()
- point["x"] = array("long"=1,"value"=0)
- point["y"] = array("long"=1,"value"=0)
- //------结构体类型定义------
- //调用 GetCursorPos 函数获取当前鼠标坐标
- dllcall("user32.dll","long","GetCursorPos","pstruct",point)
- messagebox("x:"&point["x"]["value"]&",y:"&point["y"]["value"])
6、传址的简单使用,更多使用介绍请参考论坛
- var modName
- dllcall("kernel32.dll","int","GetModuleFileNameW","int",0,"pwchar *",modName,"int",255)
- messagebox("GetModuleFileNameW:" & modName)
|