kn007 发表于 2009-10-11 17:13:08

对了,我这里返回"",error=0

sxd 发表于 2009-10-11 23:03:22


请教下,这个dll怎么做的?什么工具
能做那种有图标的dll吗?
kn007 发表于 2009-10-11 17:12 http://www.autoitx.com/images/common/back.gif
我这dll是delphi写的   
有图标的dll你随便用个语言做个dll 然后用reshack塞点图标进去就行了吧 哈哈 我猜的

bing614 发表于 2009-10-12 03:51:34

明显的语法错误,DllCall返回值是数组,

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

sxd 发表于 2009-10-12 12:52:28

明显的语法错误,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返回了数组

kn007 发表于 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 & @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

kn007 发表于 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 = 函数的返回值
$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:27:12

本帖最后由 bing614 于 2009-10-12 13:29 编辑

19# sxd


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

sxd 发表于 2009-10-12 16:33:29

19# sxd


如果函数调用失败,将会设置 @error 为一 1. 另外将会返回一个包含函数返回值和所有参数拷贝的数组(包括可能被传递后修改的函数参数).
bing614 发表于 2009-10-12 13:27 http://www.autoitx.com/images/common/back.gif
是的 这就是问题的现象 我是想问 为什么会产生这样的现象

sxd 发表于 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 & @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:34:49

本帖最后由 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了.

高手见笑了。请指正.

sxd 发表于 2009-10-12 19:53:39

哦 明白了 就是说dllcall 不管成功与否都是返回数组 明白了

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

嗯 谢谢
页: 1 [2]
查看完整版本: dllcall的问题 delphi自己可以调用 au3不行