我想要一个应用程序接口来转换MASM代码中的所有函数为回调函数。如果我们在代码中使用API函数,我们可以使用GetProcAddresses API,在代码中回调它们,但是如果我们有声明它们的函数(而不是API),我们如何使用API回调它们?
发布于 2014-02-10 15:29:35
GetProcAddress处理从动态链接库导出的函数,因此您必须从模块中导出它们并从中创建一个动态链接库。现在还不清楚你到底想做什么。如果你正在考虑从一个常规的exe文件中导出函数,那么这是不可能的。
有关如何使用MASM创建动态链接库的更多详细信息,请阅读this link。
发布于 2014-02-11 09:59:46
当然,您可以从exe中导出函数!有几种方法可以做到这一点。
对link使用/EXPORT参数
link /SUBSYSTEM:WINDOWS /EXPORT:Proc_To_Export file.obj
如果您想导出许多函数,这可能会变得混乱,在这种情况下,只需创建一个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 starthttps://stackoverflow.com/questions/21670208
复制相似问题