DLL GetProc

GetProcAddress() で DLL のエントリーアドレスを取得します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

Hello.dll を呼び出す

  1. Win32 DLL Gcm,Lcm で説明したように Win32 ネイティブモードの DLL を組み込むには LIB が必要です。
    そこで DLL から LIB を作成 で DLL から LIB を作成する方法を紹介しました。
    今回は、LIB が無くても DLL を直接組み込む「DLL の明示的なリンク」の方法を紹介します。
    LIB があるときは、これ使った方が簡単で解り易いので念のため。 (^_^;)
  2. シンプルなプロジェクトを作成するために「空のプロジェクト」から作成します。
    Visual Studio .NET を起動して[ファイル][新規作成][プロジェクト]を選びます。
    [Visual C++][Win32][Win32コンソールアプリケーション]を選択して Console の名前で作成します。

    [アプリケーションの設定]で[空のプロジェクト]を選択します。

  3. Console.cpp と Hello.h と Hello.dll をフォルダーに格納します。
    Hello.h と Hello.dll は Win32 DLL Hello を参照して下さい。
  4. Console.cpp のソースコードです。
    LoadLibrary(L"Hello.dll"); で DLL をロードします。
    GetProcAddress(hMydll,"HelloMsg"); でエントリーアドレスを取得します。
    (*fpFunc)(); で HelloMsg() 関数を呼び出します。
    #include <stdio.h>
    #include <conio.h>
    #include <windows.h>
    #include "Hello.h"
    
    void (*fpFunc)();      // 関数のエントリポイント
    
    int main(void)
    {   HINSTANCE   hMydll;
    
        // DLL をロードする
        hMydll = LoadLibrary(L"Hello.dll");
        if (!hMydll)
        {   printf("Hello.dll の Load に失敗しました\n");
            return -1;
        }
        // 関数のエントリアドレスを求める
        fpFunc = (void(*)())GetProcAddress(hMydll,"HelloMsg");
        if (fpFunc == NULL)
        {   FreeLibrary(hMydll);
            printf("HelloMsg() 関数がみつかりません\n");
            return -1;
        }
        // DLL 関数の呼び出し
        (*fpFunc)();
        FreeLibrary(hMydll);
        _getch();
        return 0;
    }
    
  5. プロジェクトを実行すると "Hello DLL" が表示されます。

GcmLcm.dll を呼び出す

  1. 同じ要領で GcmLcm.dll を呼び出します。
    空のプロジェクトを作成して Console.cpp と GcmLcm.h と GcmLcm.dll をフォルダーに格納します。
    GcmLcm.h と GcmLcm.dll は Win32 DLL Gcm,Lcm を参照して下さい。
  2. Console.cpp のソースコードです。
    LoadLibrary(L"GcmLcm.dll"); で DLL をロードします。
    GetProcAddress(hMydll,"gcm"); で gcm() 関数のエントリーアドレスを取得します。
    GetProcAddress(hMydll,"lcm"); で lcm() 関数のエントリーアドレスを取得します。
    (*fpGcm)(24,32),(*fpLcm)(24,32) で gcm() 関数と lcm() 関数を呼び出します。
    #include <stdio.h>
    #include <conio.h>
    #include <windows.h>
    #include "GcmLcm.h"
    
    int (*fpGcm)(int, int);     // gcm() 関数のエントリポイント
    int (*fpLcm)(int, int);     // lcm() 関数のエントリポイント
    
    int main(void)
    {   HINSTANCE   hMydll;
    
        // DLL をロードする
        hMydll = LoadLibrary(L"GcmLcm.dll");
        if (!hMydll)
        {   printf("GcmLcm.dll の Load に失敗しました\n");
            return -1;
        }
        // 関数のエントリアドレスを求める
        fpGcm = (int(*)(int, int))GetProcAddress(hMydll,"gcm");
        if (fpGcm == NULL)
        {   FreeLibrary(hMydll);
            printf("gcm() 関数がみつかりません\n");
            return -1;
        }
        fpLcm = (int(*)(int, int))GetProcAddress(hMydll,"lcm");
        if (fpLcm == NULL)
        {   FreeLibrary(hMydll);
            printf("lcm() 関数がみつかりません\n");
            return -1;
        }
    
        // DLL 関数の呼び出し
        printf("GCM(24,32)=%d  LCM(24,32)=%d\n", (*fpGcm)(24,32),(*fpLcm)(24,32));
        FreeLibrary(hMydll);
        _getch();
        return 0;
    }
    

超初心者のプログラム入門(C/C++)