【问题标题】:An API for convert a function to callback function in MASMMASM 中用于将函数转换为回调函数的 API
【发布时间】:2014-02-10 06:11:41
【问题描述】:

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

【问题讨论】:

    标签: assembly masm masm32


    【解决方案1】:

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

    有关如何使用 MASM 创建 DLL 的更详细信息,您可以阅读this link

    【讨论】:

    • 程序示例太长,无法在此处显示,请发送电子邮件给您发送程序
    • 我为什么要给你我的电子邮件?我不会为你写这个。阅读链接并应用导出函数所需的更改。
    • 不,我阅读了链接,但这不是我的目标!我有一个程序有几个原生函数,我不想在Dll中导出它们,我想用API将它们更改为回调模式,我想展示程序,但是在这里展示太长了!我想把程序发送到你的邮箱,所以需要你的邮箱!
    • 你可以用 C 写一个回调函数代码示例,然后让编译器生成汇编代码,这样你就可以看到同类型函数的汇编版本需要什么。
    • @user3291634:what 的回调? Win32 API?在这种情况下,您必须使您的函数遵循stdcall 调用约定。这是您在源代码中执行的操作,而不是在运行时。
    【解决方案2】:

    当然,您可以从 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 文件放在与示例控制台应用程序相同的目录中。

    如您所见,函数导出,控制台应用调用该导出函数的结果。

    您也可以使用LoadLibraryGetProcAddress

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-08
      • 1970-01-01
      • 1970-01-01
      • 2021-01-23
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多