2011-06-21 5 views
2

mingwを使用してDLLを正しくコンパイルし、エクスポート/インポートを実行できます。私が探しているのは、MS VC製品と同じようにdll onload関数を適切に定義することです。 Googleは何も出せなかった。誰でもチュートリアルへのアイデアやリンクがありますか?mingw32のdll onload関数を指定するにはどうすればよいですか?

+1

"dll onload"とは、DllMainを指していますか?あなたはそれが正しい署名を持っていると確信していますか?これは、次のようにする必要があります。extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL、DWORD Reason、LPVOID LPV)。質問にコードスニペットを追加してみてください。 –

+0

はい、それはまさに私が意味するものです、ありがとう。 – RobotHumans

+0

@ aking1012私はそのDllMain署名を質問に追加すべきだとは言っていませんが、あなた自身のDllMain署名を追加する必要はありません。 –

答えて

9

さて、いろいろなことをしてから...うまくいきました。ここに問題がある人は誰でも私の問題は、動的に読み込むのではなく、コンパイルすることに関連していませんでした。これは私にこの点を教えてくれたチュートリアル/質問/ハウツーのマッシュアップでした。

dll.c


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

//extern "C" BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD Reason, LPVOID LPV) { 
//This one was only necessary if you were using a C++ compiler 

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { 

    switch (fdwReason) 
    { 
     case DLL_PROCESS_ATTACH: 
      // Code to run when the DLL is loaded 
     printf ("Load working...\n"); 
      break; 

     case DLL_PROCESS_DETACH: 
      // Code to run when the DLL is freed 
     printf ("Unload working...\n"); 
      break; 

     case DLL_THREAD_ATTACH: 
      // Code to run when a thread is created during the DLL's lifetime 
     printf ("ThreadLoad working...\n"); 
      break; 

     case DLL_THREAD_DETACH: 
      // Code to run when a thread ends normally. 
     printf ("ThreadUnload working...\n"); 
      break; 
    } 

    return TRUE; 
} 

EXPORT void hello(void) { 
    printf ("Hello\n"); 
} 

dll.h


#ifndef DLL_H_ 
#define DLL_H_ 

#ifdef BUILD_DLL 
/* DLL export */ 
#define EXPORT __declspec(dllexport) 
#else 
/* EXE import */ 
#define EXPORT __declspec(dllimport) 
#endif 

EXPORT void hello(void); 

#endif /* DLL_H_ */ 

のhello.c


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

int main() { 

    /*Typedef the hello function*/ 
    typedef void (*pfunc)(); 

    /*Windows handle*/ 
    HANDLE hdll; 

    /*A pointer to a function*/ 
    pfunc hello; 

    /*LoadLibrary*/ 
    hdll = LoadLibrary("message.dll"); 

    /*GetProcAddress*/ 
    hello = (pfunc)GetProcAddress(hdll, "hello"); 

    /*Call the function*/ 
    hello(); 
    return 0; 
} 

 
gcc -c -DBUILD_DLL dll.c 
gcc -shared -o message.dll dll.o -Wl,--out-implib,libmessage.a 
gcc -c hello.c 
gcc -o hello.exe hello.o message.dll 

な生産でコンパイル予想される出力は

 
Load working... 
Hello 
Unload working... 

+0

偉大なあなたはそれが働いた:) –

1

です。mingwはGCCと関連するツールのWindowsポートにすぎないので、GCC constructor and destructor attributesを使用できます。これらは共有ライブラリと静的ライブラリの両方で動作し、mainが実行される前後のコードを実行します。さらに、ライブラリごとに複数のコンストラクタ関数とデストラクタ関数を指定することもできます。

static void __attribute__((constructor)) 
your_lib_init(void) 
{ 
    fprintf(stderr, "library init\n"); 
} 

static void __attribute__((destructor)) 
your_lib_destroy(void) 
{ 
    fprintf(stderr, "library destroy\n"); 
} 
+0

ありがとう。これは、nix側で同様のことをする必要がある場合、クロスプラットフォームのものに役立ちます。 – RobotHumans

+0

以前のdll.c、dll.h、hello.c、コンパイルメソッドを使用していますが、これらの関数を追加するだけで動作しません。 DLLはmain()を呼び出さないので、私は推測する –

+0

より具体的にしてください '動作しない'。 DLLはメインを呼び出すことはありません。ダイナミックリンカはライブラリコンストラクタをロード&実行し、main()、デストラクタをロードして実行します。 –

関連する問題