【发布时间】:2014-02-10 06:11:41
【问题描述】:
我想要一个 API 将MASM 代码中的所有函数转换为回调函数。如果我们在代码中使用 API 函数,我们可以使用 GetProcAddresses API 来在代码中回调它们,但是如果我们有声明它们的函数(不是 API),我们如何使用 API 回调它们?
【问题讨论】:
我想要一个 API 将MASM 代码中的所有函数转换为回调函数。如果我们在代码中使用 API 函数,我们可以使用 GetProcAddresses API 来在代码中回调它们,但是如果我们有声明它们的函数(不是 API),我们如何使用 API 回调它们?
【问题讨论】:
GetProcAddress 处理从 DLL 导出的函数,因此您必须从模块中导出它们并从中创建一个 DLL。有点不清楚你到底想做什么。如果您正在考虑从常规 exe 文件中导出函数,那么这是不可能的。
有关如何使用 MASM 创建 DLL 的更详细信息,您可以阅读this link。
【讨论】:
stdcall 调用约定。这是您在源代码中执行的操作,而不是在运行时。
当然,您可以从 exe 导出函数!有几种方法可以做到这一点。
为link 使用/EXPORT 参数
链接 /SUBSYSTEM:WINDOWS /EXPORT:Proc_To_Export file.obj
如果您想导出许多函数,这可能会变得一团糟,在这种情况下,只需像创建 DLL 一样创建一个 def 文件。
EXPORTS Func1_Name
Func2_Name
Func3_Name
etc...
link /SUBSYSTEM:WINDOWS /DEF:DEF_name program_name.obj
另一种方法是告诉 MASM 您的 proc 将使用 export 导出
include masm32rt.inc
.code
start:
AddTwo PROC EXPORT FirstNum:DWORD, SecondNum:DWORD
mov eax, FirstNum
add eax, SecondNum
ret
AddTwo ENDP
end start
组装并链接,然后将以下内容组装并链接为控制台应用程序:
include masm32rt.inc
includelib Add2_Exported.lib
AddTwo PROTO FirstNum:DWORD,SecondNum:DWORD
.code
start:
invoke AddTwo, 200, 3456
print str$(eax), 13, 10
inkey
invoke ExitProcess, 0
end start
在此示例中,我将add2_exported.exe 和相应的 lib 文件放在与示例控制台应用程序相同的目录中。
如您所见,函数被导出,控制台应用调用该导出函数的结果。
您也可以使用LoadLibrary、GetProcAddress:
include masm32rt.inc
.data
szAppName db "add2_exported.exe", 0
szFunction db "_AddTwo@8", 0
.code
start:
invoke LoadLibrary, offset szAppName
mov esi, eax
invoke GetProcAddress, eax, 1 ; use ordinal
push 3456
push 200
call eax
print str$(eax), 13, 10
invoke GetProcAddress, esi, offset szFunction ; use function name
push 3456
push 500
call eax
print str$(eax), 13, 10
invoke FreeLibrary, esi
inkey
invoke ExitProcess, 0
end start
【讨论】: