2011-09-20 58 views
1

所以我试图调用一个指向函数的指针,但是我失败了。有人可以帮忙吗?如何在MASM中调用指向函数的指针

我存储函数指针像这样:

mov pFunction,offset Function 

其实我可以得到该呼叫是通过这样的工作:

call pFunction 

但当我尝试这个办法:

invoke pFunction 

我得到“错误A2190:INVOKE需要过程原型”。

如果我试试这个:

invoke Function pFunction 

我得到 “错误A2206:缺少表达式运算符”。

任何想法?

PS:这里是整体上市:

.386 
.model flat,stdcall 
    option  casemap: none 
    include  d:\masm32\include\windows.inc 
    include  d:\masm32\include\kernel32.inc 
    includelib d:\masm32\lib\kernel32.lib 

    Function proto 
.data? 
    pFunction dd  ? 
.code 
start: 
    mov pFunction,offset Function 
    invoke pFunction 

    push 0 
    call ExitProcess 

Function proc 
    ret 
Function endp 
end start 
+0

我只是在这里找到答案 http://webster.cs.uc r.edu/Page_TechDocs/MASMDoc/ProgrammersGuide/Chap_07.htm 尽管它对我来说似乎有点不可思议......(为什么我只能在8小时后回答自己的问题?!​​) – user812775

+1

INVOKE是一个可能不是“在所有情况下完成?很明显,如果你不介意做自己的设置/拆卸,CALL将起作用(在过去的日子里,我们一直这么做,因为汇编中没有“INVOKE”)。另外值得注意的是,您引用的文档声称INVOKE扩展了短于预期项目的宽度。我遇到了一个并不那么近的案例。我有一个INVOKE,它在返回时导致崩溃。在OlyDbg中打开它,发现它是在推送一个项目(在32位应用程序中)而不是双字! –

回答

0

我只是在这里找到了答案

http://webster.cs.ucr.edu/Page_TechDocs/MASMDoc/ProgrammersGuide/Chap_07.htm

这是你必须做的:

.386 
.model flat,stdcall 
    option  casemap: none 
    include  d:\masm32\include\windows.inc 
    include  d:\masm32\include\kernel32.inc 
    includelib d:\masm32\lib\kernel32.lib 

    FUNCPROTO  TYPEDEF PROTO 
    FUNCPTR   TYPEDEF PTR FUNCPROTO 
.data? 
    pFunction FUNCPTR  ? 
.code 
start: 
    mov pFunction,offset Function 
    invoke FUNCPTR ptr pFunction 

    push 0 
    call ExitProcess 

Function proc 
    ret 
Function endp 
end start 
+0

链接被破坏,替代方法:http://www.siliconkit.com/rebecca/help/masmpguide/Chap_07.htm – Paul