找回密码
 加入
搜索
楼主: sxd

dllcall的问题 delphi自己可以调用 au3不行

[复制链接]
发表于 2009-10-11 17:13:08 | 显示全部楼层
对了,我这里返回"",error=0
 楼主| 发表于 2009-10-11 23:03:22 | 显示全部楼层
请教下,这个dll怎么做的?什么工具
能做那种有图标的dll吗?
kn007 发表于 2009-10-11 17:12

我这dll是delphi写的   
有图标的dll  你随便用个语言做个dll 然后用reshack塞点图标进去就行了吧 哈哈 我猜的
发表于 2009-10-12 03:51:34 | 显示全部楼层
明显的语法错误,DllCall返回值是数组,

$Return=DllCall("Project1.dll","int","sxd","int",10,"int",8)
MsgBox(0,"",$Return[0])
这样就正常

评分

参与人数 1金钱 +100 贡献 +10 收起 理由
kn007 + 100 + 10 很厉害!

查看全部评分

 楼主| 发表于 2009-10-12 12:52:28 | 显示全部楼层
明显的语法错误,DllCall返回值是数组,

$Return=DllCall("Project1.dll","int","sxd","int",10,"int",8)
MsgBox(0,"",$Return[0])
这样就正常
bing614 发表于 2009-10-12 03:51

这.....这算哪门子语法错误 还明显  

你也看到我的delphi函数了 怎么是数组呢
要么就是某个环节失败了 dllcall返回了数组
发表于 2009-10-12 13:20:10 | 显示全部楼层
$a = DllCall("Project1.dll","int","sxd","int",2,"int",4)
MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$a' & @lf & @lf & 'Return:' & @lf & $a[0] & @lf & @lf & '@Error:' & @lf & @Error) ;### Debug MSGBOX


他说的不是???


现在error=0就是无错误
$a[0]就是返回值,不明白你为什么这样说

 Local $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', -1)
Return $ai_Return[0]

DllCall返回必须要搞个[0]
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[0])
        DllCall('kernel32.dll', 'int', 'CloseHandle', 'int', $ai_Handle[0])
    Else
        Local $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', -1)
    EndIf

    Return $ai_Return[0]
EndFunc   ;==>_ReduceMemory
发表于 2009-10-12 13:20:28 | 显示全部楼层
不是和你那个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[0] = 函数的返回值
$return[1] = 参数1
$return[2] = 参数2
...
$return[n] = 参数n
 *******************************************************
; 示例 2 - 调用一个函数修改参数
; *******************************************************

$hwnd = WinGetHandle("[CLASS:Notepad]")
$result = DllCall("user32.dll", "int", "GetWindowText", "hwnd", $hwnd, "str", "", "int", 32768)
msgbox(0, "", $result[0])   ; 返回的字符数
msgbox(0, "", $result[2])   ; 在参数 2 返回的文本
.
.
这.....这算哪门子语法错误 还明显  

你也看到我的delphi函数了 怎么是数组呢
要么就是某个环节失败了 dllcall返回了数组
sxd 发表于 2009-10-12 12:52



我要表达的意思就是不是dllcall出错了,才会返回数组
发表于 2009-10-12 13:27:12 | 显示全部楼层
本帖最后由 bing614 于 2009-10-12 13:29 编辑

19# sxd


如果函数调用失败,将会设置 @error 为一 1. 另外将会返回一个包含函数返回值和所有参数拷贝的数组(包括可能被传递后修改的函数参数).
 楼主| 发表于 2009-10-12 16:33:29 | 显示全部楼层
19# sxd


如果函数调用失败,将会设置 @error 为一 1. 另外将会返回一个包含函数返回值和所有参数拷贝的数组(包括可能被传递后修改的函数参数).
bing614 发表于 2009-10-12 13:27

是的 这就是问题的现象 我是想问 为什么会产生这样的现象
 楼主| 发表于 2009-10-12 16:35:16 | 显示全部楼层
$a = DllCall("Project1.dll","int","sxd","int",2,"int",4)
MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$a' & @lf & @lf & 'Return:' & @lf & $a[0] & @lf & @lf & '@Error:' & @lf ...
kn007 发表于 2009-10-12 13:20


dllcall的返回值 必须要$a[0]? 这倒是第一次听说
我以前用的 if _xxxxxx(yyyy) then  岂不是错了 囧
发表于 2009-10-12 18:34:49 | 显示全部楼层
本帖最后由 bing614 于 2009-10-12 18:37 编辑

如果DllCall成功,返回值必定为数组,至于有效返回值是$a[0]还是$a[1]或者$a[x]就要看你DLL的参数类型和你需要的数据了。
如你的DLL为例,参数都为输入型参数,所以有效返回值必定为$a[0];

再如:GetComputerName (获取本机机器名称)
C++ 
BOOL WINAPI GetComputerName(
  __out    LPTSTR lpBuffer,
  __inout  LPDWORD lpnSize
);
这个函数有两个参数:

lpBuffer 一个缓存区用于存放计算机名(输出型)
lpnSize lpBuffer缓存区大小(输入输出型参数)

dllcall调用 GetComputerName
#include<array.au3>
$_Return=DllCall("Kernel32.dll","int","GetComputerName","str",0,"dword*",16)
_ArrayDisplay($_Return)
返回值有3个
$_Return[0] dllcall调用是否成功0=失败,1=成功
$_Return[1] 对应GetComputerName参数1
$_Return[2] 对应GetComputerName参数2

如果需要检测此GetComputerName调用是否成功返回值就是$_Return[0]
如果需要得到本机计算机名称所以有效返回值应该是$_Return[1]
如果需要得到本机计算机名长度那就有效返回值就应该是$_Return[2]了.

高手见笑了。请指正.
 楼主| 发表于 2009-10-12 19:53:39 | 显示全部楼层
哦 明白了 就是说dllcall 不管成功与否都是返回数组 明白了

上面的 if _xxxx(yyyy) then  我是和一个UDF搞混了 那个UDF封装了dllcall

嗯 谢谢
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-14 19:13 , Processed in 0.068704 second(s), 15 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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