首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MASM中将函数转换为回调函数的API

问在MASM中将函数转换为回调函数的API
EN

Stack Overflow用户
提问于 2014-02-10 14:11:42
回答 2查看 275关注 0票数 0

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

EN

回答 2

Stack Overflow用户

发布于 2014-02-10 15:29:35

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

有关如何使用MASM创建动态链接库的更多详细信息,请阅读this link。

票数 0
EN

Stack Overflow用户

发布于 2014-02-11 09:59:46

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

对link使用/EXPORT参数

link /SUBSYSTEM:WINDOWS /EXPORT:Proc_To_Export file.obj

如果您想导出许多函数,这可能会变得混乱,在这种情况下,只需创建一个def文件,就像创建动态链接库一样。

代码语言:javascript
复制
EXPORTS Func1_Name
Func2_Name
Func3_Name
etc... 

link /SUBSYSTEM:WINDOWS /DEF:DEF_name program_name.obj

另一种方法就是告诉MASM您的proc是用export导出的。

代码语言:javascript
复制
include masm32rt.inc

.code
start:    

AddTwo PROC EXPORT FirstNum:DWORD, SecondNum:DWORD    
    mov     eax, FirstNum
    add     eax, SecondNum
    ret
AddTwo ENDP

end start

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21670208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档