Assembly MASM中用于将函数转换为回调函数的API

Assembly MASM中用于将函数转换为回调函数的API,assembly,masm,masm32,Assembly,Masm,Masm32,我需要一个API将MASM代码中的所有函数转换为回调函数。如果我们在代码中使用API函数,我们可以使用GetProcAddresses API在代码中回调它们,但是如果我们有声明它们不是API的函数,我们如何用API回调它们呢 GetProcAddress处理从DLL导出的函数,因此您必须从模块中导出这些函数并从中创建DLL。有点不清楚你到底想做什么。如果您正在考虑从常规exe文件导出函数,那么这是不可能的 有关如何使用MASM创建DLL的详细信息,请阅读。当然,您可以从exe导出函数!有几种方

我需要一个API将MASM代码中的所有函数转换为回调函数。如果我们在代码中使用API函数,我们可以使用GetProcAddresses API在代码中回调它们,但是如果我们有声明它们不是API的函数,我们如何用API回调它们呢

GetProcAddress处理从DLL导出的函数,因此您必须从模块中导出这些函数并从中创建DLL。有点不清楚你到底想做什么。如果您正在考虑从常规exe文件导出函数,那么这是不可能的


有关如何使用MASM创建DLL的详细信息,请阅读。

当然,您可以从exe导出函数!有几种方法可以做到这一点

对链接使用/EXPORT参数

链接/子系统:WINDOWS/EXPORT:Proc_To_EXPORT file.obj

如果要导出许多函数,这可能会变得很混乱,在这种情况下,只需像为DLL创建def文件一样创建def文件

EXPORTS Func1_Name
Func2_Name
Func3_Name
etc... 
链接/子系统:WINDOWS/DEF:DEF_name程序_name.obj

另一种方法是告诉MASM您的proc将与export一起导出

组装并链接,然后组装并链接以下内容作为控制台应用程序:

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:


prograqm示例太长,无法在此处显示,比如发送电子邮件给您,为什么我要给您发送电子邮件?我不会给你写这封信的。阅读链接并应用导出函数所需的更改。不,我阅读了链接,但这不是我的目标!我有一个程序有几个本机函数,我不想在Dll中导出它们,我想使用API将它们更改为回调模式,我想显示该程序,但在这里显示太长了!我想发送程序到您的邮件,所以需要您的邮件!您可以用C编写一个回调函数代码示例,然后让编译器生成汇编代码,这样您就可以看到相同类型函数的汇编程序版本需要什么。@user3291634:什么回调?Win32 API?在这种情况下,必须使函数遵循stdcall调用约定。这是在源代码中执行的操作,而不是在运行时执行。
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
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