2011-06-30 8 views
1

以外の機能は動作しません私はGetProcAddressのに問題があります: 私はそれで一つだけの機能で簡単なDLLを書いた:私はのGetProcAddressをして失敗した関数のアドレスを取得しようとするとのGetProcAddressがvoid

extern "C" LRESULT WINAPI Function(HWND Hwnd, UINT Message, 
            WPARAM wParam, LPARAM lParam) 
{ 
    Beep(1000, 1000); 
    return CallNextHookEx(0, Message, wParam, lParam); 
} 

ErrorCode 127(ERROR_PROC_NOT_FOUND)。しかし、関数型としてvoidを使用すると完全に機能します。なぜそれがこのように振る舞うのか理解できない。どんな提案も大歓迎です!

BTW:DependencyWalkerは、関数の名前が実際には「関数」であり、変更は適用されていないことを示しています。

答えて

4

のGetProcAddressのための唯一の2つの障害モードがあります:

  • あなたが機能
  • をエクスポートしませんでしたエクスポートこの関数の名前の右

名を取得していませんさ.defファイルを使用してエクスポートの名前を変更したり、64ビットのDLLを作成した場合を除き、 "Function"ではありません。 32ビットのビルドでは "_Function @ 16"になります。 @ 16の接尾辞は、引数をつけて関数のために働かせるのに問題があるという事実と強く関連しています。

Visual Studioのコマンドプロンプトから、DLLにDumpbin.exe/exportsを実行して、エクスポートを確認します。 .pdbファイルがある場合は、同じディレクトリ内の.pdbファイルを削除します。

+0

フムなしている、_function」、 "_function 16 @" インポートしようとした "_function @ 32" と@ 64 "しかし、それは動作しませんでした....私はlitteを実験し、今それは本当に変です。関数型をLPARAM WINAPIからvoidに変更すると、GetProcAddressはすべての関数名に対して正常に機能しますが、これらの関数は存在しませんが、 "abc"のようなものですら機能します。 GetProcAddressは機能しませんが、私は元の型を使用しています! – dllloader

+0

WINAPIを使用しないと、__stdcallが無効になり、@ postfixが停止します。実際の名前を見つけるにはdumpbin.exe/exportsを実行する必要があります。スキップしないでください。 –

+0

私はCode :: BlocksをMinGW64と一緒に使用していますので、できません。何か別の選択肢はありますか? – dllloader

2

モジュール定義(.defファイル)を、__declspec(dllexport)ではなく、エクスポートされた関数の名前で使用することをお勧めします。それらを管理する方がはるかに簡単です。

はまたDLL関数名をエクスポートし、この

#define DllExport extern "C" __declspec (dllexport)

原因は、任意のC++ "装飾"