Что нового

Смысл функции DllCallAddress()

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Не пойму, какой смысл от функции DllCallAddress(), понял что с помощью неё можно вызвать любую функцию

Код:
$pPointer = DllCallbackRegister("Summ", "int", "int;int")
$Ret = DllCallAddress("int", DllCallbackGetPtr($pPointer), "int", 3, "int", 5)
DllCallbackFree($pPointer)

MsgBox(0, 'Return', $Ret[0])

Func Summ($Num1, $Num2)
	Return $Num1 + $Num2
EndFunc


Но разве не легче

Код:
MsgBox(0, 'Return', Summ(3, 5))

Func Summ($Num1, $Num2)
	Return $Num1 + $Num2
EndFunc


Для чего она может пригодится?

Или вот с оф.форума

Код:
MsgBox(0,"",Factorial(7))

Func Factorial($iNumber)
    $bOPCode = "0xD9E8DB442404D9E8DFF1730CD9C0D9E8DEE9D9C9DECAEBEEDDD8C20400"
    $iSize = BinaryLen($bOPCode)
    $pBuffer = _MemVirtualAlloc(0, $iSize, $MEM_COMMIT, $PAGE_EXECUTE_READWRITE)
    $tBuffer = DllStructCreate("byte[" & $iSize & "]", $pBuffer)
    DllStructSetData($tBuffer, 1, $bOPCode)
    $aRet = DllCallAddress("double", $pBuffer, "int", $iNumber)
    _MemVirtualFree($pBuffer, $iSize, $MEM_RELEASE)
    If IsArray($aRet) Then
        Return $aRet[0]
    Else
        Return "ERROR"
    EndIf
EndFunc


Где же тогда брать ОП код?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
DllCallAddress - динамически вызывает функцию по определенному адресу памяти
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Жаль нельзя таким образом вызывать функцию по адресу чужого процесса :(
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Вроде да, но нужно внести изменения, в примере показано как можно вызвать функцию из AutoItX.dll, скрипт открывает данную dll, считывает её содержимое в память, далее по моему считывает данные со структуры dll, а дальше я ещё не разобрался как оно работает... :(

Вот кусочек с MemoryDll.au3

Код:
Local $IMAGE_DOS_HEADER = DllStructCreate($tagIMAGE_DOS_HEADER, $DllDataPtr)
	If DllStructGetData($IMAGE_DOS_HEADER, "e_magic") <> 0x5A4D Then
		Return SetError(1, 0, 0)
	EndIf


Здесь он сравнивает сигнатуру, если она равна MZ то продолжает работу, а файлы exe и dll имеют почти ту же самую сигнатуру но разную структуру


Добавлено:
Сообщение автоматически объединено:

Сейчас попробывал вызвать функцию из скомпилированного exe - не получилось, видимо и не получится... :scratch:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
DllCallAddress() это аналог _WinAPI_CallWindowProc(), но с произвольным количеством параметров. Довольно удобная функция.
 
Верх