# Function Reference

# DllCallAddress

Dynamically calls a function at a specific memory address.

DllCallAddress ( "return type", address [, type1, param1 [, type n, param n]] )

## Parameters

return type | The return type of the function (see below).
address | The address of a function. If this value is invalid your script will crash!
type1 | [optional] The type of the parameter (see remarks).
param1 | [optional] The actual parameter (see remarks).
type n | [optional] The type of the nth parameter (see remarks).
param n | [optional] The actual nth parameter (see remarks).

Valid Types are:

Type | Details
NONE | no value (only valid for return type - equivalent to void in C)
BYTE | an unsigned 8 bit integer
BOOLEAN | an unsigned 8 bit integer
SHORT | a 16 bit integer
USHORT | an unsigned 16 bit integer
WORD | an unsigned 16 bit integer
INT | a 32 bit integer
LONG | a 32 bit integer
BOOL | a 32 bit integer
UINT | an unsigned 32 bit integer
ULONG | an unsigned 32 bit integer
DWORD | an unsigned 32 bit integer
INT64 | a 64 bit integer
UINT64 | an unsigned 64 bit integer
PTR | a general pointer (void *)
HWND | a window handle (pointer)
HANDLE | an handle (pointer)
FLOAT | a single precision floating point number
DOUBLE | a double precision floating point number
INT_PTR, LONG_PTR, LRESULT, LPARAM | an integer big enough to hold a pointer when running on x86 or x64 versions of AutoIt.
UINT_PTR, ULONG_PTR, DWORD_PTR, WPARAM | an unsigned integer big enough to hold a pointer when running on x86 or x64 versions of AutoIt.
STR | an ANSI string (a minimum of 65536 chars is allocated).
WSTR | a UNICODE wide character string (a minimum of 65536 chars is allocated).
STRUCT | structure created with DllStructCreate()
* | Add * to the end of another type to pass it by reference. For example "int*" passes a pointer to an "int" type.

Conversions from Windows API types to AutoIt types:

WINDOWS API Type | AutoIt Type
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

To use nested structures inside a structure you must re-define the nested structure. For example, a structure containing 2 POINT structures ("long;long") would be declared as "long;long;long;long". The first two long values correspond to the first POINT structure and the second two values correspond to the second POINT structure.
For more Windows API types see MSDN.

## Return Value

Success: | an array. See remarks.
Failure: | sets the @error flag to non-zero.
@error: | 2 = unknown "return type", 4 = bad number of parameters, 5 = bad parameter

## Remarks

By default, AutoIt uses the 'stdcall' calling method. To use the 'cdecl' method place ':cdecl' after the return type.
If the function call fails then the @error flag is set to non-zero.
Otherwise an array is returned that contains the function return value and a copy of all the parameters (including parameters that the function may have modified when passed by reference).
$return[0] = function return value
$return[1] = param1
$return[2] = param2
...
$return[n] = paramn

Special Note: This is an advanced function. Incorrect use of this function may cause AutoIt to crash. Before using this function make sure DllCall() doesn't do what you need.

## Related

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

## Example

    #include <GUIConstantsEx.au3>
    #include <MsgBoxConstants.au3>
    #include <WinAPISysWin.au3>
    #include <WindowsNotifsConstants.au3>

    Example()

    Func Example()
        ; Enable GUI event mode.
        Opt("GUIOnEventMode", 1)

        ; Create a simple GUI.
        Local $hWnd = GUICreate("DllCallAddress Example")

        ; Register the close event handler.
        GUISetOnEvent($GUI_EVENT_CLOSE, "OnClose")

        ; Show the GUI.
        GUISetState(@SW_SHOWNORMAL, $hWnd)

        ; Get a pointer to the window's WindowProc().
        Local $pWndProc = _WinAPI_GetWindowLong($hWnd, $GWL_WNDPROC)

        ; Tell the user what is about to happen.
        MsgBox($MB_SYSTEMMODAL, "DllCallAddress Example Msg", "When you press OK the test window will close.")

        ; Explicitly generate a WM_CLOSE event and pass it directly to the WindowProc().
        ; This should never be done in a real application (Use _SendMessage() instead) but
        ; it demonstrates how to use the function.
        DllCallAddress("LRESULT", $pWndProc, "HWND", $hWnd, "UINT", $WM_CLOSE, "WPARAM", 0, "LPARAM", 0)
    EndFunc   ;==>Example

    Func OnClose()
        GUIDelete(@GUI_WinHandle)
        MsgBox($MB_SYSTEMMODAL, "DllCallAddress Example Msg", "Close event received, the test window should now be closed.")
    EndFunc   ;==>OnClose