找回密码
 加入
搜索
查看: 7585|回复: 22

[AU3基础] (已解决)如何查看自带函数是如何编写的?

 火.. [复制链接]
发表于 2010-12-20 17:20:56 | 显示全部楼层 |阅读模式
本帖最后由 yarsye 于 2010-12-23 10:30 编辑

像msgbox、fileselectfolder函数 ,如何知道这些是怎么写的?完全不知道是include在哪个au3里面!
发表于 2010-12-20 18:21:21 | 显示全部楼层
我觉得只要是脚本开头不需要 include <*.au3> 的都是看不着的
发表于 2010-12-20 18:36:46 | 显示全部楼层
这些都不是用AU3写的
发表于 2010-12-20 18:59:46 | 显示全部楼层
内置函数
可能本身(解析器)不需要编写
只把函数动作转给具有该功能的DLL去执行,然后取返回状态再处理
!
查看写法就要去查看执行该函数的DLL的源码
!
 楼主| 发表于 2010-12-21 09:11:46 | 显示全部楼层
那怎么能知道 像fileopendialog这种是调用哪个DLL文件的呢?
发表于 2010-12-22 08:37:27 | 显示全部楼层
貌似我们都是用AU3来搭积木的,具体积木是怎么做出来的,有点高难了!
 楼主| 发表于 2010-12-22 11:17:16 | 显示全部楼层
只想知道 人家是怎么定义 fileopendialog之类的 函数
发表于 2010-12-22 12:02:19 | 显示全部楼层
;帮助 MsgBox 例子

MsgBox(0, "若干标题", "若干文本")




_MsgBox(0, "若干标题", "若干文本")

Func _MsgBox($0, $1, $2)

        $dll = DllOpen("user32.dll")
        $result = DllCall($dll, "int", "MessageBox", "hwnd", 0, "str", String($2), "str", String($1), "int", 0)
        DllClose($dll)

EndFunc   ;==>_MsgBox
 楼主| 发表于 2010-12-22 12:08:15 | 显示全部楼层
回复 8# _ddqs.


   我的意思是 如果fileopendialog也能看到是如何调用DLL的 那改写DLL 是否能实现文件夹多选功能?
发表于 2010-12-22 12:42:12 | 显示全部楼层
回复  _ddqs.


   我的意思是 如果fileopendialog也能看到是如何调用DLL的 那改写DLL 是否能实现文件夹 ...
yarsye 发表于 2010-12-22 12:08

那些应该是编译器本身执行的动作,还有DLL能改写么?DLL貌似没开源吧
 楼主| 发表于 2010-12-22 13:26:26 | 显示全部楼层
回复 10# tryhi


    如果知道了调用哪个DLL ,我们自己可以调用DLL然后写些不一样的东西出来啊

例如:
func myfileopendialog();=fileopendialog + 另外一些功能
dllcall(xxxx)
xxxx
xxx
endfunc
发表于 2010-12-22 13:35:58 | 显示全部楼层

评分

参与人数 1金钱 +10 收起 理由
tryhi + 10 赞一个

查看全部评分

 楼主| 发表于 2010-12-22 14:17:26 | 显示全部楼层
回复 12# pusofalse


    老大你真牛!你是如何知道他的原型的?我怎么样才能知道其他函数的原型呢?到哪能查到吗?
发表于 2010-12-22 15:24:37 | 显示全部楼层
回复 13# yarsye


    没事时去逛一下MSDN技术资源库,看得多了,积累一些经验。几乎AutoIt中所有的内置函数,都可以在MSDN上找到其原型API。例如内置函数MsgBox是调用User32.dll中的MessageBoxW函数,RegRead调用了AdvApi32.dll中的RegQueryValueExW,FileCopy调用了Kernel32中的CopyFileW等等。
AutoIt的作者为了让使用AutoIt的人更加快速地入门,或为了一些其他目的,多少会舍弃掉一些API的功能,例如内置函数ProcessClose实际是调用了Kernel32.dll中的TerminateProcess函数,TerminateProcess一共有2个参数,一个是进程Pid(实际是进程的句柄),一个是进程的退出代码ExitCode,而作者将其封装成ProcessClose之后,却丢弃了ExitCode参数,所以用ProcessClose结束的进程,它的退出代码总是0,这样做带来的后果就是不能区分进程到底是执行成功还是执行失败。要实现一些更加强大的功能,不得不自己调用一些稍底层的系统函数,但这样做又显示不出AutoIt的易学。

用AutoIt工具箱里的Dependency Walker工具可以查看Dll中的系统函数,找到需要的函数之后就到MSDN或Google搜索它的调用方法吧。

评分

参与人数 1金钱 +20 贡献 +10 收起 理由
yarsye + 20 + 10 佩服!

查看全部评分

 楼主| 发表于 2010-12-22 17:25:00 | 显示全部楼层
非常感谢!!!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-22 21:36 , Processed in 0.090439 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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