電子書籍の厳選無料作品が豊富!

初回はLoadLibrary()が"cnpdsdk.dll"が成功するが、2回目からはLoadLibrary()が"cnpdsdk.dll"を読み込み失敗してしまいます。原因は何なのでしょうか?

// -----------------------------------------------------
// (7):指定された実行可能モジュールを、呼び出し側プロセスのアドレス空間内にマ ップ
// -----------------------------------------------------
hDLL = LoadLibrary(PDSDK_DLL);
if(hDLL == NULL){
// エラー処理
MessageBox("実行可能モジュールのマッピングに失敗しました","LoadLibrary() failed", MB_OK|MB_ICONEXCLAMATION);
FreeResource();// リソース解放
m_Combo_SelectPrinter.SetCurSel(-1); // 現在の選択項目を削除(使用するプリンタ)
return;
}

A 回答 (5件)

なにがおかしいか言うなら何度も使うDLLを都度FreeLibraryすることがおかしい


FreeLibraryはLoadLibraryと絶対に対にならなければならないようにしているとかならその強迫観念が間違ってる
FreeLibraryせずにプロセスが終了するとリソースリーク起こすとか思っちゃいませんか
普通のプログラムならFreeLibraryを呼び出す必要は全くない
    • good
    • 0
この回答へのお礼

どうもありがとうございました。
FreeLibraryの記述部分をなくした結果うまく動作しました。
ありがとうございました

お礼日時:2009/04/01 13:18

>DWORD dwErr = GetLastError();で調べたところ下記のプログラムを通過すると


>エラーが発生することがわかりました。しかしおかしいところはなにもありません。

で、GetLastError()でどんな値が戻ってきていたんですか?
掲示されたコードだけでは特に問題になっているとも思えませんが。
強いてあげれば、FreeLibrary()が成功しているのかな?と…。
ただ、ロード済みのDLLをLoadLibrary()してもNULLは戻らないと思われますが。
…普通なら、ですけどね。
DllMain()の処理によってはNULLを返すこともあるでしょうし。

# それ以前にデバッガの使い方を理解されていないような気がするのですが…。
    • good
    • 0

>GetLastError(),はどのように使えばいいのでしょうか?



オウム返しに聞く前に検索しましょう。

hDLL = LoadLibrary(PDSDK_DLL);
if(hDLL == NULL){
// エラー処理
のあとあたりにでも、
DWORD dwErr = GetLastError();
とでもして値を取得してください。
ブレークポイント張って、値をデバッガで覗いてからヘッダファイル内をGrepするもよし、
ErrorLookupでメッセージ化してみるもよし、
FormatMessage()でメッセージ化してMessageBox()で表示するなり、ログに出力するなり…
ちなみに、私の場合は最初と2番目の方法ですかね。
ErrorLookupでエラーの内容を確認する。
ヘッダに定義されているエラー名でググる。
など。

この回答への補足

DWORD dwErr = GetLastError();で調べたところ下記のプログラムを通過すると
エラーが発生することがわかりました。しかしおかしいところはなにもありません。
わかるようでしたら教えていただきたくよろしく御願いします。

// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
CStringFileName;
CFileDialog*dlgFile;
CWnd*pWnd;

dlgFile = new CFileDialog(TRUE, "dat", "*.dat",OFN_FILEMUSTEXIST,
"*.dat|全て(*.*)|*.*||");

if (dlgFile->DoModal() == IDOK){
FileName = dlgFile->GetPathName();//選択ファイル名取得
}

delete dlgFile;
pWnd = (CWnd *)GetDlgItem(IDC_STATIC1);
pWnd->SetWindowText(FileName);

FreeResource();// リソース解放

return;


FreeResource();のなかにFreeLibrary()が入っています。

補足日時:2009/03/31 15:35
    • good
    • 0

失敗時GetLastError()は何を返しますか

この回答への補足

勉強不足ですみません。
GetLastError(),はどのように使えばいいのでしょうか?

補足日時:2009/03/30 20:39
    • good
    • 0

1回目にLoadLibrary()したプログラムは、使い終わったらFreeLibrary()していますか?



使い終わったのにFreeLibrary()しないままプログラムを終了させると、場合によっては「DLL内の排他処理」のせいで「使用している人が居るからと、2度目のLoadLibrary()を拒否」するかも知れません。

この回答への補足

FreeLibrary()は下記のように使用しています


// ダイナミックリンクライブラリ(DLL)の解放
if(hDLL != NULL){
FreeLibrary(hDLL);
hDLL = NULL;

補足日時:2009/03/30 19:04
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!