· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Адрес процедуры передать в invoke

Посл.отвђт Сообщенiе


Дата: Сен 5, 2003 12:44:15

Есть некая DLL, есть к ней .inc и .lib файлы, так что можно использовать invoke. Все работает хорошо, пока эта DLL находится в одной из стандартных папок. Но когда расположение DLL определяется только в runtime, то приходится использовать LoadLibrary+GetProcAddress, которые дают указатель на процедуру, который можно передать оператору CALL.
Вопрос в следующем: как использовать invoke, чтобы он вызывал процедуру не по сведениям из .lib-файла, а использовал полученный указатель-на-процедуру? Исходные данные такие:

;одна из функций из .inc
SomeFunctionZZZ PROTO :DWORD,:DWORD

;код программы (синтаксис упрощен для краткости)
hMod = LoadLibrary("DllPathAndName")
ProcAddr = GetProcAddress(hMod, "SomeFunctionZZZ")

;как построить invoke, чтобы он использовал именно полученный ProcAddr ? HELP!


Дата: Сен 5, 2003 12:53:39

Это не Invoke строить нужно, а PROTO или EXTERNDEF объявление.

В принципе можно указать, что ты публикуешь не имя а указатель...
Но вот как это сделать с регистром eax.. я не знаю.


Дата: Сен 5, 2003 12:58:14

Насколько я знаю - никак. Но можно самому макрос написать.


Дата: Сен 5, 2003 13:29:37

.386
.model flat, stdcall
option casemap:none

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib

proto04 typedef proto :DWORD, :DWORD, :DWORD, :DWORD
pproto04 typedef ptr proto04

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

.const
szUser32		db "user32.dll", 0
szMessageBox	db "MessageBoxA", 0

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

.data?
g_hinstanceUser32	HINSTANCE		?
g_pfnMessageBox		pproto04		?

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

.code
start:

	invoke LoadLibrary, offset szUser32
	mov g_hinstanceUser32, eax
	invoke GetProcAddress, eax, offset szMessageBox
	mov g_pfnMessageBox, eax
	invoke [g_pfnMessageBox], NULL, NULL, NULL, MB_OK
	invoke FreeLibrary, g_hinstanceUser32
	invoke ExitProcess, 0

end start


Дата: Сен 5, 2003 13:42:22 · Поправил: Edmond

Four-F
Браво, а
invoke [eax], NULL, NULL, NULL, MB_OK

Пройдёт?


Дата: Сен 5, 2003 13:57:10

Пройдет, если написать перед вызовом
assume eax:proto04
invoke eax, 0,0,0,0


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.080