1

DLL ファイル (helloWorld.dll) を作成しました。

#define WIN32_LEAN_AND_MEAN
#include <windows.h>

#define DLL_FUNC extern "C" __declspec(dllexport)

DLL_FUNC int __stdcall Hello() {
    MessageBox(HWND_DESKTOP, "Hello, world", "MEssage", MB_OK);
    return 0;
 }

その後、呼び出したいcppを作成しました(useDLL.cpp)

#include <windows.h>
#include <stdio.h>

int main () {
    typedef void (*pfunc)();
    HINSTANCE hdll = LoadLibrary("HelloWorld.dll");
    pfunc Hello;
    Hello = (pfunc)GetProcAddress(hdll, "hello");
    Hello();
    return 0;
}

Hello() 関数を呼び出すにはどうすればよいですか?

4

2 に答える 2

5

問題のコードには、いくつかのエラーが含まれています。

  1. LoadLibrary戻るHMODULEのではなくHINSTANCE
  2. 関数ポインターの戻り値と呼び出し規約が正しくありません。
  3. 関数名では大文字と小文字が区別されるため、名前の装飾を考慮する必要があります。
  4. エラーチェックはまったく行いませんでした。で関数を呼び出そうとすると、コードは、の呼び出しに失敗しGetProcAddress、戻り、爆弾を投下する可能性があります。NULLNULL

したがって、次のようなものが必要です。

typedef int (__stdcall *HelloProc)();
....
HMODULE hdll = LoadLibrary("HelloWorld.dll");
if (hdll == NULL)
    // handle error
HelloProc Hello = (HelloProc)GetProcAddress(hdll, "_Hello@0");
if (Hello == NULL)
    // handle error
int retval = Hello();

を使用したため、関数名が装飾されています__stdcall。、または.defファイルを使用した場合__cdecl、装飾はありませんでした。MSVCの装飾を想定しています。コンパイラ、mingwによって装飾が異なるようで、関数の名前は"Hello@0"です。

LoadLibrary率直に言って、andを呼び出す代わりに.libファイルを使用する方がはるかに簡単ですGetProcAddress。できれば、今はその方法に切り替えます。

于 2013-03-18T17:18:24.627 に答える
0

探している特定の関数を具体的に検索して見つける必要があります。このリンクをチェックしてください: Calling functions in a DLL from C++

于 2013-03-18T17:16:28.370 に答える