2012-04-12 13 views
3

このようにMessageBox()関数を呼び出すとします:
GetProcAddress関数でMessageBoxを呼び出す方法は?

1)。必要なライブラリをロードする
2)。関数のアドレスを取得
3)。それを呼び出す

私が理解するように、私はMessageBox関数ですべての型の引数を持つ新しい型を定義する必要があります。

INTを返し、HWND、LPCSTR、LPCSTR、UNITを受け入れます。

だから私は、新しいタイプregistred:私は、このような関数を呼び出すことに問題がある

typedef int(__stdcall *msgbox)(HWND, LPCSTR, LPCSTR, UINT); 

を。そのようなやり方は、すべての機能に対して、あるいは輸出のためだけに機能しますか?
どうすればMessageBoxを正確に呼び出すことができますか?

全コード:

#include <iostream> 
#include <windows.h> 

using namespace std; 

typedef int(__stdcall *msgbox)(HWND, LPCSTR, LPCSTR, UINT); 

int main(void) 
{ 
    HINSTANCE__ *hModule = LoadLibrary(L"\\Windows\\System32\\User32.dll"); 
    msgbox *me = 0; 

    if(hModule != 0) 
    { 
     me = (msgbox*)GetProcAddress(hModule, "MessageBox"); 
    } 

    return 0; 
} 

おかげで、
よろしく!

答えて

3

なぜすべてをポインタとして宣言していますか?

LoadLibrary戻りHMODULE、ないHINSTANCE__ *(それは後者で動作しますが、それはマニュアルを遵守することは常に良いでしょう)。

同様に、msgboxのでmemsgbox、ないmsgbox *で、関数ポインタ型にtypedef D」です。

GetProcAddressが失敗する理由は、user32.dllが2つの関数、MessageBoxAMessageBoxWをエクスポートするためです。単純にコード内でMessageBoxを呼び出すと、Windows.hで定義されたマクロは、UNICODEのコンパイルの有無に応じて、2つの実際の関数名の1つに置き換えられます。しかし、エクスポートされた関数に直接アクセスしようとしているときは、ポインタを取得しようとしているものを明示的に指定する必要があります。

#include <iostream> 
#include <windows.h> 

typedef int(__stdcall *msgbox)(HWND, LPCSTR, LPCSTR, UINT); 

int main(void) 
{ 
    HMODULE hModule = ::LoadLibrary(L"User32.dll"); 
    msgbox me = NULL; 

    if(hModule != NULL) { 
    me = reinterpret_cast<msgbox>(::GetProcAddress(hModule, "MessageBoxA")); 
    } 

    if(me != NULL) { 
    (*me)(NULL, "I'm a MessageBox", "Hello", MB_OK); 
    } 

    if(hModule != NULL) { 
    ::FreeLibrary(hModule); 
    } 
} 
+0

このようなアドバイスをいただきありがとうございます。 –

+0

DLLで非エクスポート関数を呼び出す方法を知りませんか?ありがとうございました! –

+0

@ user1131997私はそれを行う方法がないとは思わない – Praetorian

関連する問題