Function Reference

首页  后退  前进

DllCall

 

调用 DLL 文件中的函数.

 

DllCall ( "dll", "return type", "function" [, type1, param1 [, type n, param n]] )

参数

dll

DLL 文件名. 例如 "user32.dll". 也可使用由 DllOpen 返回的句柄 (见备注).

return type

函数的返回类型 (见下文).

function

DLL 文件内的函数名称, 例如 "MessageBox" 或序号值, 例如 62.

type1

[可选] 第一个类型参数 (见备注).

param1

[可选] 第一个实际参数 (见备注).

type n

[可选] 第 n 个类型参数 (见备注).

param n

[可选] 第 n 个实际参数 (见备注).

 

类型值:

 

类型

描述

NONE

没有值 (用于只有一个有效返回的类型 - 相当于 C 语言的 void)

BYTE

无符号 8 位整数

BOOLEAN

无符号 8 位整数

SHORT

16 位整数

USHORT

无符号 16 位整数

WORD

无符号 16 位整数

INT

32 位整数

LONG

32 位整数

BOOL

32 位整数

UINT

无符号 32 位整数

ULONG

无符号 32 位整数

DWORD

无符号 32 位整数

INT64

64 位整数

UINT64

无符号 64 位整数

PTR

常规指针 (void *)

HWND

窗口句柄 (指针)

HANDLE

句柄(指针)

FLOAT

单精度浮点数

DOUBLE

双精度浮点数

INT_PTR, LONG_PTR, LRESULT, LPARAM

当运行在 x86 或 x64 版本的 AutoIt 时, 一个大到足以容纳一个指针的整数.

UINT_PTR, ULONG_PTR, DWORD_PTR, WPARAM

当运行在 x86 或 x6 4版本的 AutoIt 时, 大到足以容纳一个指针的无符号整数.

STR

ANSI 字符串 (至少分配 65536 个字符).

WSTR

Unicode 宽字符字符串 (至少分配 65536 个字符).

STRUCT

用于 DllStructCreate() 创建结构

*

添加 * 到类型的末尾作为另一种类型传递的参考. 例如 "int*" 传递 "int" 类型的指针.

 

 

Windows API 类型转换为 AutoIt 类型:

 

WINDOWS API 类型

AutoIt 类型

LPCSTR/LPSTR

STR

LPCWSTR/LPWSTR

WSTR

LPVOID

PTR

LPxyz

xyz*

HINSTANCE

HANDLE

HRESULT

LONG

LONGLONG/LARGE_INTEGER

INT64

ULONGLONG/ULARGE_INTEGER

UINT64

SIZE_T

ULONG_PTR

要在结构中使用嵌套结构,必须重新定义嵌套结构.

例如, 一个结构包含 2 POINT ("long;long"), 必须定义为 "long;long;long;long".

前两个 long 值对应的第一个 POINT; 后两个 long 值对应的第二个 POINT.

了解更多的 Windows API 类型, 请参考 MSDN.

 

返回值

成功:

返回一个数组, 见备注.

失败:

@error 设置 为非 0 值.

@error:

1 = 不能使用这个 DLL 文件

2 = 未知的 "返回类型"

3 = 在 DLL 文件中未找到这个"函数"

4 = 参数数量错误.

5 = 参数无效.

 

备注

如果指定 dll 文件名, DLL 将会被自动加载, 并在调用结束后关闭.

如果要手动控制 DLL 的加载和卸载, 则应使用 DllOpen()DllClose() 函数, 并使用句柄代替文件名.

 

默认 AutoIt 使用 'stdcall' 的调用约定. 要使用 'cdecl' 调用方式, 在返回值类型后面加上 ':cdecl'. 例如:

DllCall("SQLite.dll", "int:cdecl", "sqlite3_open", "str", $sDatabase_Filename , "long*", 0).

 

默认 AutoIt 使用 ANSI 的函数名, 例如 MessageBoxA 使用 MessageBox 给出的函数名.

要调用 unicode 版本, 使用 MessageBoxW.

 

如果函数调用失败, 将设置 @error 为非 0 值

否则返回包含函数返回值和所有参数副本的数组 (包括可能被传递参数修改的函数参数).

$return[0] = 函数返回值

$return[1] = 参数1

$return[2] = 参数2

...

$return[n] = 参数n

 

该函数可以通过exect命令调用.

 

相关

DllCallbackFree, DllCallbackGetPtr, DllCallbackRegister, DllClose, DllOpen, DllStructCreate, DllStructGetPtr

函数示例

示例 1

; Calling the MessageBox API directly.
DllCall("user32.dll", "int", "MessageBox", _
        "hwnd", 0, _ ; Handle to the parent window
        "str", "Some text", _ ; The text of the message box
        "str", "Some title", _ ; The title of the message box
        "int", 0) ; Flags for the message box.

示例 2

#include <MsgBoxConstants.au3>
; Calling a function that modifies parameters,
Local $iPID = Run("notepad")
Local $hWnd = WinWait("[CLASS:Notepad]", "", 2000)
If $hWnd = 0 Then
    ; Timeout occured.
    Exit MsgBox($MB_SYSTEMMODAL, Default, "Unable to start notepad!")
EndIf
Local $aResult = DllCall("user32.dll", "int", "GetWindowText", "hwnd", $hWnd, "str", "", "int", 32768)
MsgBox($MB_SYSTEMMODAL, Default, "Number of characters returned: " & $aResult[0])
MsgBox($MB_SYSTEMMODAL, Default, "Text (returned in parameter 2): '" & $aResult[2] & "'")
WinClose($hWnd)

示例 3

#include <MsgBoxConstants.au3>
; Show the Windows PickIconDlg.
Local $sFileName = @SystemDir & '\shell32.dll'
; Create a structure to store the icon index
Local $tIconIndex = DllStructCreate("int")
Local $tString = DllStructCreate("wchar[260]")
Local $iStructsize = DllStructGetSize($tString) / 2
DllStructSetData($tString, 1, $sFileName)
; Run the PickIconDlg - '62' is the ordinal value for this function
DllCall("shell32.dll", "none", 62, _
        "hwnd", 0, _
        "struct*", $tString, _
        "int", $iStructsize, _
        "struct*", $tIconIndex)
$sFileName = DllStructGetData($tString, 1)
Local $iIconIndex = DllStructGetData($tIconIndex, 1)
; Show the new filename and icon index
MsgBox($MB_SYSTEMMODAL, "Info", "Last selected file: " & $sFileName & @CRLF & "Icon-Index: " & $iIconIndex)

-----------------

 

 

该函数可以通过命令调用 exect

 

exect=DllCall('user32.dll','int','MessageBox','hwnd',0,'str','文本test','str','标题','int',0)

exect=$var_i=DllCall('user32.dll','int','GetSystemMetrics','int',4)||_ViewValues($var_i) - 获得窗口标题的高度

 

"exect=$var_h=DllCall('user32.dll','hwnd','GetDesktopWindow')[0]||_ViewValues('16:~~'&'$var_h'&@CRLF&'10:~~'&$var_h,'描述~~窗口~~工作~~表')" - 获取桌面窗口描述符

 

exect=$var_i=DllCall('user32.dll','int','GetSystemMetrics','int',4)||_ViewValues($var_i) ;; 获得窗口标题的高度

 

exect=$var_hdll=DllOpen('user32.dll')||$var_res=DllCall($var_hdll,'int','MessageBox','hwnd',0,'str','Текст','str','Заголовок','int',0)||$var_hdll=DllClose(($var_hdll)||_ViewValues($var_res) ;;DLL调用的例子

 

exect=$var_0=Assign('STRUCT_1',create.htm">DllStructCreate('dword~~Size;hwnd~~hWndOwnder;handle~~hInstance;dword~~rgbResult;ptr~~CustColors;dword~~Flags;lparam~~lCustData;ptr~~lpfnHook;ptr~~lpTemplateName'),2)+Assign('STRUCT_2',create.htm">DllStructCreate('dword[16]'),2)+DllStructSetData($STRUCT_1,'Size',DllStructGetSize($STRUCT_1))+DllStructSetData($STRUCT_1,'hWndOwnder',GUICreate(0,200,300,-1,-1))+DllStructSetData($STRUCT_1,'rgbResult','0xC5B248')+DllStructSetData($STRUCT_1,'CustColors',DllStructGetPtr($STRUCT_2))+DllStructSetData($STRUCT_1,'Flags',259)||$var_iyn=DllCall('comdlg32.dll','bool','ChooseColor','struct*',$STRUCT_1)[0]||$var_0=$var_iyn=0?_Exit():1||$var_num=DllStructGetData($STRUCT_1,'rgbResult')||$var_ibrg=Hex($var_num,6)||_ViewValues('$var_ibrg','BRG~~Color') ;; 创建并运行颜色选择窗口

 

exect=$var_handle=WinGetHandle('[CLASS:TTOTAL_CMD]')||$var_0=Assign('STRUCT_RECT',create.htm">DllStructCreate(':tagRECT:'),2)+DllCall('user32.dll','bool','GetWindowRect','hwnd',Eval('var_handle'),'struct*',$STRUCT_RECT)||$var_s='Координаты~~углов~~TC:'&@CRLF&'X1:~~'&DllStructGetData($STRUCT_RECT,'Left')&@CRLF&'X2:~~'&DllStructGetData($STRUCT_RECT,'Right')&@CRLF&'Y1:~~'&DllStructGetData($STRUCT_RECT,'Top')&@CRLF&'Y2:~~'&DllStructGetData($STRUCT_RECT,'Bottom')||_ViewValues('$var_s') ;; 获取Total Commander窗口的坐标

 

exect=$var_h=DllCall('user32.dll','hwnd','GetDesktopWindow')[0]||_ViewValues('16:~~'&'$var_h'&@CRLF&'10:~~'&$var_h,'Дескриптор~~окна~~рабочего~~стола') ;; 获取桌面窗口描述符

 

exect=$var_0=Assign('STRUCT_ICON',create.htm">DllStructCreate('int'),2)+Assign('STRUCT_STRING',create.htm">DllStructCreate('wchar[260]'),2)+DllStructSetData($STRUCT_STRING,1,@SystemDir&'\shell32.dll')||$var_iyn=DllCall('shell32.dll','int',62,'hwnd',GUICreate(0,400,400,-1,-1),'struct*',$STRUCT_STRING,'int',DllStructGetSize($STRUCT_STRING)/2,'struct*',$STRUCT_ICON)[0]||$var_0=$var_iyn=0?_Exit():1||$var_s=DllStructGetData($STRUCT_STRING,1)&','&DllStructGetData($STRUCT_ICON,1)||_ViewValues('$var_s','Путь~~и~~номер~~значка') ;; 在系统对话框中选择一个图标

 

"exect=$var_htc=WinGetHandle('[CLASS:TTOTAL_CMD]')||_ViewValues('$var_htc') exect=$var_hss=DllCall('user32.dll','handle','SendMessage','hwnd',$var_htc,'uint',1074,'wparam',7,'lparam',0)[0]||_ViewValues('$var_hss') exect=$var_sss=DllCall('user32.dll','int','GetWindowTextW','hwnd',$var_hss,'wstr','''','int',4096)[2]||_ViewValues('$var_sss')" - 获取Total Commander左面板状态栏的文本