2017-02-04 22 views
-1

我有一個全局變量,簽名爲PostMessage api和procedure,嘗試獲得地址PostMessage,然後在我的程序的其他幾個單元中調用PostMessageGetProcAddress如何獲取PostMessage api?

發生在我的測試PostMessage不起作用,沒有任何操作,沒有出現沒有錯誤異常。

這裏是我的代碼:

var 

    PostMessageAddr_: function(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL;stdcall; 

... 

    procedure GetPostMessage; 
    var 
    hModulo: HMODULE; 
    begin 
     hModulo := GetModuleHandle(User32); 
     PostMessageAddr_ := GetProcAddress(hModulo, 'PostMessage'); 
     FreeLibrary(hModulo); 
    end; 

感謝任何幫助。

+1

不要調用FreeLibrary。只需從Windows單元調用PostMessage就簡單多了。你爲什麼這樣做? –

+0

'PostMessage'就像廣告一樣工作。也許你的代碼中存在一個錯誤。在未加載的模塊上調用FreeLibrary肯定值得懷疑。 – IInspectable

+0

@DavidHeffernan,我使用'GetProcAddress'來繞過IAT Hook:D –

回答

3

PostMessage()未導出爲'PostMessage',因此您的GetProcAddress('PostMessage')調用未能找到它。它實際上是作爲兩個單獨的函數導出的,分別爲ANSI的PostMessageA()和Unicode的'PostMessageW(),其中PostMessage()本身就是映射到基於您正在編譯的環境的其他函數之一的別名。

此外,不要致電FreeLibrary()GetModuleHandle(),只從LoadLibrary/Ex()獲得處理。

試試這個:

var 
PostMessageAddr_: function(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall; 

... 

procedure GetPostMessage; 
var 
    hModulo: HMODULE; 
begin 
    hModulo := GetModuleHandle(User32); 
    @PostMessageAddr_ := GetProcAddress(hModulo, {$IFDEF UNICODE}'PostMessageW'{$ELSE}'PostMessageA'{$ENDIF}); 
end; 

話雖這麼說,德爾福自身Windows單元已經聲明瞭聯動PostMessage()你,你也不需要手動獲取指針。只需在您的uses條款中包含Windows,然後像其他任何函數一樣呼叫PostMessage()