2011-09-20 105 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

相關問題