DLL を Dyamic にリンクする

LoadLibrary() と GetProcAddress() で DLL を Dyamic にリンクします。
DLL は Dynamic Link Library の略ですが、実は今までの方法では Dynamic に Link したとは言い難い所があります。
それはプログラムの起動時に DLL がロードされるので、DLL が見つからないとプログラム自身が起動できません。
DLL を Dynamic に運用するには DLL に登録された関数を呼び出す直前にリンクするのです。

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

プロジェクトの設定

  1. プログラムを極力シンプルに仕上げるために、LZH で圧縮された TEXT ファイルを解凍して MessageBox で表示します。
  2. 新規プロジェクトで[空のプロジェクト]を作成して次のファイルを格納して下さい。
    今までのプロジェクトと違い unlhavc.lib や unlha32.h を格納する必要はありません。
    ファイル 説明
    Dynamic.cpp Main Program File
    unlha32.dll LHA を解凍する DLL
    file_a.lzh file_a.txt が格納れている LZH File
  3. プログラムを実行するには unlha32.dll が必要です。
    カレントディレクトリまたは、C:\Windows\system32 のフォルダーに格納して下さい。
  4. Dynamic.cpp の全ソースコードです。
    ウインドウを使わずに極力シンプルに作成しました。
    typedef で関数のエントリー宣言をします。
    LoadLibrary() で DLL をロードします。
    GetProcAddress() で関数のエントリーポイントを取得します。
    (*fpFunc) で関数を呼び出します。
    FreeLibrary() で DLL を開放します。
        /********************************************/
        /*★ DLL を Dynamic に呼び出す    前田 稔 ★*/
        /********************************************/
        #include    <windows.h>
        #include    <time.h>
    
        // 関数ポインタの形式定義
        typedef int (WINAPI *PTFUNC)(HWND, LPCSTR, LPBYTE, DWORD, time_t *, LPWORD, LPDWORD);
    
        PTFUNC  fpFunc;
        BYTE    buf[512];
        DWORD   dLen;
    
        //★ Windows Main 関数
        int PASCAL  WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int nCmdShow)
        {   HINSTANCE   hMydll;
    
            // DLL をロードする
            hMydll = LoadLibrary("unlha32.dll");
            if (!hMydll)
            {   MessageBox(NULL,"unlha32.dll の Load に失敗しました","Error",MB_OK);
                return -1;
            }
            // 関数のエントリアドレスを求める
            fpFunc = (PTFUNC)GetProcAddress(hMydll,"UnlhaExtractMem");
            if (fpFunc == NULL)
            {   FreeLibrary(hMydll);
                MessageBox(NULL,"UnlhaExtractMem() 関数がみつかりません","Error",MB_OK);
                return -1;
            }
            // DLL 関数の呼び出し
            (*fpFunc)(NULL,"file_a.lzh c: file_a.txt",buf,512,NULL,NULL,&dLen);
            buf[dLen] = '\0';
            MessageBox(NULL,(char*)buf,"file_a.lzh",MB_OK);
            FreeLibrary(hMydll);
            return 0;
        }
        
  5. この方法は LoadLibrary() が実行されたときに DLL が呼び出されるので、DLL が見つからなくても起動時に落ちることはありません。
    CAB ファイルを解凍する Microsoft の説明書では、強くこの方法を推奨しています。
    unlhavc.lib や unlha32.h は必要ありませんが、関数名と呼び出し形式が解からないとプログラム出来ません。

【演習】

  1. LoadLibrary() と GetProcAddress() を使って、解凍した TEXT を DialogBox に表示するプログラムを作成して下さい。
  2. LHA で圧縮された TEXT を表示 を Dyamic にリンクするように修正して下さい。

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