TC官方合作论坛

 找回密码
 立即注册
查看: 1865|回复: 3

[学习心得] 【类人猿TC内存探讨】 第四讲:忽略的 dllcall使用

[复制链接]
发表于 2017-8-11 09:50:47 | 显示全部楼层 |阅读模式

马上加入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一般都会被指定缓存长度大小
charchar,CHAR在WIN32中 带字符操作的结构体也是区分 A/W两类函数,分别表示支持ASCII编码还是UNOICDE编码
char 表示ASCII编码的字符串
在结构体中出现char一般都会被指定缓存长度大小
double
double,DOUBLE
double,占位8字节,双精度浮点数
long
long,LONG,DWORD
long,占位4字节,在TC的应用中最为广泛,他不仅仅只能表示数值类型,他还可以表示指针(指针说法比较复杂放在实例中讲解)
longlong
long long,LONGLONGlonglong,占位8字节,某些特殊的api需要
shortshort,SHORT,WORDshort,占位2字节,以无符号形式展示0-65535之间
bytechar,CHAR,UCHAR,,byte,BYTEbyte,占位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)









回复

使用道具 举报

发表于 2017-8-11 11:47:42 | 显示全部楼层
占个沙发,支持
回复 支持 反对

使用道具 举报

发表于 2017-8-17 20:14:41 来自手机 | 显示全部楼层
普通变量传值。
普通变量传址,数组传址,结构体传址。
回复 支持 反对

使用道具 举报

发表于 2017-8-28 23:02:21 | 显示全部楼层
支持一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18045623号)

GMT+8, 2024-5-19 13:00 , Processed in 0.036359 second(s), 23 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

快速回复 返回顶部 返回列表