FreeLibrary()でエラー

[戻る]
TERA 2006/06/18(日) 18:57:23
『開発環境』
WindosXP
VC2003
SDK

以下のようなコードを実行すると、
FreeLibrary(g_hRtLib)のところで「ハンドルされていない例外が発生しました」と
エラーがでて正常に終了できません。
これはいったいなぜなのでしょうか。
g_hRtLib = LoadLibrary("RICHED32.DLL") はWinMain()の中にあることが前提として、
解決策がありましたら、教えてください。

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
グローバル領域

    HINSTANCE g_hRtLib;


WinMain()内

    g_hRtLib = LoadLibrary("RICHED32.DLL");


WinMainのプロシージャ内

    case IDCANCEL :
           FreeLibrary(g_hRtLib);


〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

超初心者 2006/06/18(日) 19:41:18
正確にどういうプログラムなのかわからないので推測です。
キャンセルが押された時点では未だウィンドウが存在するからな。
プログラムが終了する間際でいいのかも。

TERA 2006/06/19(月) 11:26:31
プロシージャ内の、終了は次のようにしています・・。

switch (message) {

    case WM_COMMAND :
        switch (LOWORD (wParam)) {

      case IDM_END :
      case IDCANCEL :
         ★
        DestroyWindow(hWnd);
    
        }
        return TRUE;


     case WM_CLOSE:
    PostMessage(hWnd,WM_COMMAND,IDCANCEL,0);
    return TRUE;

     case WM_DESTROY :
    PostQuitMessage (0);
     }

return FALSE;
}

FreeLibrary(g_hRtLib);を★の箇所に書いています。
ほかの箇所に書いたりもしましたが、だめでした。

Blue 2006/06/19(月) 11:49:00
> ほかの箇所に書いたりもしましたが、だめでした。
メッセージループのところでFreeLibraryするのではなく、
WinMain内のreturn文の直前でやっても、エラーがでますでしょうか?

TERA 2006/06/19(月) 12:58:02
Blueさま

正常に終了できました!
しかし、どうしてWinMain内のreturn文の直前だと、
正常にFreeLibraryできるのでしょうか・・・

Blue 2006/06/19(月) 13:05:47
たぶん超初心者さんがおっしゃっている
> キャンセルが押された時点では未だウィンドウが存在するからな。
ということで、

メッセージループの中ではウィンドウが存在する
↓
RICHED32.DLLを使わなければならない状態

ということでしょう。(多分ウィンドウを破棄するときに必要なんだろうな)
でその前で、FreeLibraryすると都合が悪くなるということかな。

TERA 2006/06/19(月) 18:21:01
[[解決]]
超初心者さん Blueさん 
ご親切にどうもありがとうございました!
なるほどという感じです。

古いスレッドには追加発言できません。