2017-02-04 6 views
-1

私は、PostMessage apiとprocedureという署名を持つグローバル変数を持っています。私のプログラムのいくつかの他のユニットではPostMessageを呼び出し、その後PostMessageを呼び出します。GetProcAddressによる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フックをバイパスしています:D –

答えて

3

PostMessage()'PostMessage'としてエクスポートされないため、GetProcAddress('PostMessage')コールでは検索できません。実際には、ANSIの場合はPostMessageA()、Unicodeの場合は'PostMessageW()の2つの別個の関数としてエクスポートされます。PostMessage()は、コンパイルする環境に基づいて他の関数にマップするエイリアスです。

また、GetModuleHandle()から取得したハンドルにFreeLibrary()を呼び出さず、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()を呼び出してください。

関連する問題