请教下,这个dll怎么做的?什么工具
能做那种有图标的dll吗?
kn007 发表于 2009-10-11 17:12 http://www.autoitx.com/images/common/back.gif
我这dll是delphi写的
有图标的dll你随便用个语言做个dll 然后用reshack塞点图标进去就行了吧 哈哈 我猜的 明显的语法错误,DllCall返回值是数组,
$Return=DllCall("Project1.dll","int","sxd","int",10,"int",8)
MsgBox(0,"",$Return)
这样就正常 明显的语法错误,DllCall返回值是数组,
$Return=DllCall("Project1.dll","int","sxd","int",10,"int",8)
MsgBox(0,"",$Return)
这样就正常
bing614 发表于 2009-10-12 03:51 http://www.autoitx.com/images/common/back.gif
这.....这算哪门子语法错误 还明显
你也看到我的delphi函数了 怎么是数组呢
要么就是某个环节失败了 dllcall返回了数组 $a = DllCall("Project1.dll","int","sxd","int",2,"int",4)
MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$a' & @lf & @lf & 'Return:' & @lf & $a & @lf & @lf & '@Error:' & @lf & @Error) ;### Debug MSGBOX
他说的不是???
现在error=0就是无错误
$a就是返回值,不明白你为什么这样说
如 Local $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', -1)
Return $ai_Return
DllCall返回必须要搞个Func _ReduceMemory($i_PID = -1)
If $i_PID <> -1 Then
Local $ai_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $i_PID)
Local $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', $ai_Handle)
DllCall('kernel32.dll', 'int', 'CloseHandle', 'int', $ai_Handle)
Else
Local $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', -1)
EndIf
Return $ai_Return
EndFunc ;==>_ReduceMemory 不是和你那个exe同样返回了4注意/说明
如果dll使用的是一个文件名,这个DLL将会被自动载入,并在调用结束后关闭并卸载. 如果您想手动控制载入或者卸载一个dll文件,您需要使用 DllOpen 和 DllClose 操作DLL句柄代替dll文件名.
默认情况下, AutoIt 使用 'stdcall' 调用方式. 要使用 'cdecl' 方式调用,请在返回值类型后面加上 ':cdecl' .
DllCall("SQLite.dll", "int:cdecl", "sqlite3_open", "str", $sDatabase_Filename , "long*", 0).
默认情况下, AutoIt 尝试使用 ANSI 版本的函数名, 例如. MessageBoxA 为尝试调用 MessageBox 所得到的函数名. 要调用 unicode 版本的函数,请使用 MessageBoxW.(注意:这里是指如果存在的情况下,虽然微软的函数都带有ANSI和UNICODE版本的函数,但是不保证其它DLL也带有)
如果函数调用失败,将会设置 @error 为一 1. 另外将会返回一个包含函数返回值和所有参数拷贝的数组(包括可能被传递后修改的函数参数).
$return = 函数的返回值
$return = 参数1
$return = 参数2
...
$return = 参数n
*******************************************************
; 示例 2 - 调用一个函数修改参数
; *******************************************************
$hwnd = WinGetHandle("")
$result = DllCall("user32.dll", "int", "GetWindowText", "hwnd", $hwnd, "str", "", "int", 32768)
msgbox(0, "", $result) ; 返回的字符数
msgbox(0, "", $result) ; 在参数 2 返回的文本
.
.
这.....这算哪门子语法错误 还明显
你也看到我的delphi函数了 怎么是数组呢
要么就是某个环节失败了 dllcall返回了数组
sxd 发表于 2009-10-12 12:52 http://www.autoitx.com/images/common/back.gif
我要表达的意思就是不是dllcall出错了,才会返回数组 本帖最后由 bing614 于 2009-10-12 13:29 编辑
19# sxd
如果函数调用失败,将会设置 @error 为一 1. 另外将会返回一个包含函数返回值和所有参数拷贝的数组(包括可能被传递后修改的函数参数). 19# sxd
如果函数调用失败,将会设置 @error 为一 1. 另外将会返回一个包含函数返回值和所有参数拷贝的数组(包括可能被传递后修改的函数参数).
bing614 发表于 2009-10-12 13:27 http://www.autoitx.com/images/common/back.gif
是的 这就是问题的现象 我是想问 为什么会产生这样的现象 $a = DllCall("Project1.dll","int","sxd","int",2,"int",4)
MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$a' & @lf & @lf & 'Return:' & @lf & $a & @lf & @lf & '@Error:' & @lf ...
kn007 发表于 2009-10-12 13:20 http://www.autoitx.com/images/common/back.gif
dllcall的返回值 必须要$a? 这倒是第一次听说
我以前用的 if _xxxxxx(yyyy) then岂不是错了 囧 本帖最后由 bing614 于 2009-10-12 18:37 编辑
如果DllCall成功,返回值必定为数组,至于有效返回值是$a还是$a或者$a就要看你DLL的参数类型和你需要的数据了。
如你的DLL为例,参数都为输入型参数,所以有效返回值必定为$a;
再如:GetComputerName (获取本机机器名称)C++
BOOL WINAPI GetComputerName(
__out LPTSTR lpBuffer,
__inoutLPDWORD lpnSize
);
这个函数有两个参数:
lpBuffer 一个缓存区用于存放计算机名(输出型)
lpnSize lpBuffer缓存区大小(输入输出型参数)
dllcall调用 GetComputerName#include<array.au3>
$_Return=DllCall("Kernel32.dll","int","GetComputerName","str",0,"dword*",16)
_ArrayDisplay($_Return)返回值有3个
$_Return dllcall调用是否成功0=失败,1=成功
$_Return 对应GetComputerName参数1
$_Return 对应GetComputerName参数2
如果需要检测此GetComputerName调用是否成功返回值就是$_Return
如果需要得到本机计算机名称所以有效返回值应该是$_Return
如果需要得到本机计算机名长度那就有效返回值就应该是$_Return了.
高手见笑了。请指正. 哦 明白了 就是说dllcall 不管成功与否都是返回数组 明白了
上面的 if _xxxx(yyyy) then我是和一个UDF搞混了 那个UDF封装了dllcall
嗯 谢谢
页:
1
[2]