• ベストアンサー

2回目からはLoadLibrary()が"cnpdsdk.dll"を読み込み失敗する。

初回は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; }

質問者が選んだベストアンサー

  • ベストアンサー
noname#208124
noname#208124
回答No.5

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

fwhf0162
質問者

お礼

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

その他の回答 (4)

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.4

>DWORD dwErr = GetLastError();で調べたところ下記のプログラムを通過すると >エラーが発生することがわかりました。しかしおかしいところはなにもありません。 で、GetLastError()でどんな値が戻ってきていたんですか? 掲示されたコードだけでは特に問題になっているとも思えませんが。 強いてあげれば、FreeLibrary()が成功しているのかな?と…。 ただ、ロード済みのDLLをLoadLibrary()してもNULLは戻らないと思われますが。 …普通なら、ですけどね。 DllMain()の処理によってはNULLを返すこともあるでしょうし。 # それ以前にデバッガの使い方を理解されていないような気がするのですが…。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.3

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

fwhf0162
質問者

補足

DWORD dwErr = GetLastError();で調べたところ下記のプログラムを通過すると エラーが発生することがわかりました。しかしおかしいところはなにもありません。 わかるようでしたら教えていただきたくよろしく御願いします。 // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください CString FileName; 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()が入っています。

noname#208124
noname#208124
回答No.2

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

fwhf0162
質問者

補足

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

  • chie65535
  • ベストアンサー率43% (8526/19383)
回答No.1

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

fwhf0162
質問者

補足

FreeLibrary()は下記のように使用しています // ダイナミックリンクライブラリ(DLL)の解放 if(hDLL != NULL){ FreeLibrary(hDLL); hDLL = NULL;

関連するQ&A

  • LoadLibrary

    ズバリマイホームというソフトをインストールできません。インストールすると「Runtime Error」がでたので http://service1.symantec.com/SUPPORT/INTER/navjapanesekb.nsf/jp_docid/20020502200600958 のページにしたがって操作をすすめました。 「Rsabase.dllの再登録を行う」という手順のところで 「ファイル名を指定して実行」をすると 『LoadLibrary("C:\Windows\System32\Rsabase.dll")に失敗しました - 指定されたモジュールが見つかりません。』 とでてきます。どうしたらいいのでしょうか? このソフトは私のパソコンでは使えないのでしょうか? パソコンはWinXPを使っています。 あと、ウイルスセキュリティーが常に起動している状態です。(関係あるのかわかりませんが・・・) 解決策がありましたら、手順を教えていただけるとありがたいです。 どうかよろしくお願いします。

  • regsvr32 Shdocvw.dll で 失敗します

    windows Xp SP3 IE6 を使用していて、新しいウインドウが開かなかったり、固まったりするので イベントログをみたら エラー発生アプリケーション iexplore.exe、バージョン 6.0.2900.5512、エラー発生モジュール shdocvw.dll、バージョン 6.0.2900.5512、エラー発生アドレス 0x00034254 と表示されていました。 regsvr32 Shdocvw.dll をファイル名を指定して実行を行うと、 Shdocvw.dll の DllRegisterServer は失敗しました。 戻りコード 0x8002801cと表示が出ます。 regsvr32.exe /u Shdocvw.dll は成功します。その後の regsvr32.exe /i Shdocvw.dll は上記同様の失敗表示が発生します。 urlmon.dll Shdocvw.dll Actxprxy.dll Oleaut32.dll Mshtml.dll Browseui.dll Shell32.dllはそれぞれ成功します。 どなたか再インストールなしに復旧する方法をご教授願います。 よろしくお願いします。

  • VC++フォームアプリケーションにDLLをリンク2

    2日前に、同じタイトルで投稿した者です。 http://okwave.jp/qa/q7326569.html その節は素晴らしい回答を頂きありがとうございました。 それを実現するように、作成して頂いたプログラムの修正に取り組んでいるのですが、うまく行きません。 どなたかお力をお貸し下さいm(>o<)m 前回の回答で、指摘されたように、LoadLibrary/GetProcAddress/FreeLibrary を用いて 作成して頂いたプログラムを修正しました。 具体的には、ボタンを押すとSecretFunc関数を呼び出すコードForm1.cppを以下のように修正しました。ビルドしても、エラーは出ません。 次に、このプログラムのReleaseフォルダー内のDLL_sample.dllを 前回、私が投稿したソースコード(http://okwave.jp/qa/q7326569.html)で作成したDLL_sample.dllと置き換えました。 そして、プログラムを起動(WinForm_sample.exe)すると、エラーは発生しないのですが、SecretFunc関数が見つけられず、プログラムの"No DLL"表示の方を通ります。 その原因が分かりません。 プログラムは全て、VC++2010ExpressEditionで作成しています。 もし、お分かりの方がいらっしゃいましたら、ご教授のほどよろしくお願いします。 //修正したForm1.cppのコード #include "stdafx.h" #include "Form1.h" #include "DLL_sample.h" #include <Windows.h> typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT); namespace WinForm_sample { System::Void Form1::btnCalc_Click(System::Object^ sender, System::EventArgs^ e) { System::Double a, b; if ( System::Double::TryParse(txtA->Text, a) && System::Double::TryParse(txtB->Text, b) ) { HINSTANCE hDLL; // Handle to DLL LPFNDLLFUNC1 lpfnDllFunc1; // Function pointer //DWORD dwParam1; //UINT uParam2, uReturnVal; hDLL = LoadLibrary(TEXT("DLL_sample.dll")); if (hDLL != NULL) { lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,"SecretFunc"); if (!lpfnDllFunc1) { // call the function double c = SecretFunc(a,b); txtResult->Text = c.ToString(); // handle the error FreeLibrary(hDLL); //return SOME_ERROR_CODE; } else { // Initializes the variables to pass to the MessageBox.Show method. txtResult->Text = L"No DLL"; } } else { txtResult->Text = L"不正な入力"; } } } }

  • ActiveBasic リソースの追加と読み込み

    ActiveBasic 4.23.00を使用しています。 以前、リソースの追加方法を教授していただきました。 リソースの追加と言うものは出来るようになったのですが、 文字列の都合上、以前の質問を使用させていただきます。 http://oshiete1.goo.ne.jp/qa4983148.html 上のコードを使用しているのですが、これだとやはり、『文字列』しか追加できないのでしょうか。 zip等のファイルを追加していきたいと思っているのですが、どのようにすればよろしいのでしょうか。 また、このコードを使用して、リソースをプログラムBに追加したところ、 プログラムBのアイコンが消えてしまいました。 これは、何か回避する方法があるのでしょうか。 最後に、 Declare Function FindResource Lib "kernel32" Alias "FindResourceA" (hInstance As DWord,lpName As BytePtr,lpType As BytePtr) As DWord Declare Function FreeResource Lib "kernel32" (hResData As DWord) As DWord Declare Function SizeofResource Lib "kernel32" (hInstance As DWord,hResInfo As DWord) As DWord Declare Function LoadResource Lib "kernel32" (hInstance As DWord,hResInfo As DWord) As DWord Declare Function LockResource Lib "kernel32" (hResData As DWord) As Long Const RT_MANIFESTID=50'埋め込んだ時と同じIDにしてください Const RT_MANIFEST="BINTYPE" Dim FileName[MAX_PATH] As Byte Dim hDLL As DWord, hResource As DWord, lResource As DWord Dim File As BytePtr GetModuleFileName(NULL,FileName,MAX_PATH) hDLL=LoadLibrary(FileName) If hDLL=0 Then MessageBox(hMainWnd,"ファイルの取得に失敗","Error 1",MB_OK or MB_ICONHAND) Exit Sub End If hResource=FindResource(hDLL,RT_MANIFESTID,RT_MANIFEST) If hResource=0 Then FreeLibrary(hDLL) MessageBox(hMainWnd,"ファイルの取り出しに失敗!","Error 1",MB_OK or MB_ICONHAND) Exit Sub End If lResource=LoadResource(hDLL,hResource) File=LockResource(lResource) FreeResource(lResource) FreeLibrary(hDLL) プログラムBに追加した物を取り出すプログラムですが、これはプログラムBに書きました。 実行すると、読み出しの部分でエラーが生じるのですが、どのように回避していけばよろしいのでしょうか。 長々と多くの質問をしてしまいすみません。 しかし、全然解決できずにもやもやしていて困っています。 何かやり方をご存知の方がいらっしゃいましたらご教授をお願いします。

  • ライブラリ内の処理中におけるライブラリリンクについて

    VC2005を使用しています。 ライブラリからライブラリファイルって使用できるんでしょうか? (例) A.lib内の処理に、B.DLLを明示的に読み込み処理 ----------------- <A.lib内の処理> hDLL = LoadLibrary("B.dll"); // DLLのロード if (hDLL != NULL) { ~ 処理実行 ~ } ----------------- 私の環境で何度やっても、GetLastErrorにて、 "7E"(ERROR_MOD_NOT_FOUND)が出力されます。 ロードしているパスに、B.dllは必ずあります。 上記の例は明示的リンクですが、暗黙的リンクでもかまいません。 ライブラリ処理の中でライブラリファイルを使用するには、 どうすれば良いでしょうか。 もしかして、ライブラリ内で他のライブラリを使用できない 等のオチもあるのでしょうか...。

  • windows Updateで・・・

    windows Updateで「エラー 0x80246008」がでまくってます。  解決方法で、「qmgr.dll 」 と「qmgrproxy.dll 」を登録しなさいと表示されるのですが、「qmgr.dll 」の登録は、「ファイル名」を指定して実行できるのですが、(regsvr32 qmgr.dll) 「qmgrproxy.dll 」の登録(regsvr32 qmgrproxy.dll)をしようとすると、 「LoadLibrary("qmgrproxy.dll")に失敗しました-指定したモジュールが見つかりません。」 と表示されます。 ログをみるとかなり前から、windows Updateが使えてないようです。どうすれば出来るでしょうか? 方法を教えてください。

  • エラー 指定されたモジュールが見つかりません。

    PCを起動するたび、 エラー  指定されたモジュールが見つかりません。  LoadLibrary(pythondll) failed というエラーが表示されてしまいます。 OKを押すと エラー  C:\Program Files\Uniblue\DriverScanner\PYTHON27.DLL と表示されます。 表示されなくなるにはどうしたらいいか教えてください。

  • ソフトがインストールできません。

    フリーソフトのHandyGestures(マウスジェスチャー)をインストールしようとしたら、 「LoadLibrary(”Handygestures.dll”)に失敗しました-指定されたモジュールが見つかりません。」 と表示されインストールできません。 どうしたらインストールできるでしょうか? アドバイスよろしくお願いします。

  • NET2005でDllが読み込めない

      質問に追記をしたいので新設してもう一度質問をしました。 プラットフォームはVS.NET2005でC++で記述しています。 OSはWindows XP SP3です。 自分で作成したDLLを読み込むためにLoadLibrary関数でDLLを読み込んだハズなんですがエラーになり、エラー値126で、指定したモジュールがありません と出ます。 たしかに指定したフォルダにDLLがあるはずなんですが。 DLLの方は実は.NET2003で作られたDLLです。 しかし2003でも2005でも関係なくDLLは読み込まないようです。 ただ、.NET2003からコンバートしたソリューションだと正常にdllファイルを読み込んでいます。 NET2005で新規作成でプロジェクトを作り、そこの.cppファイルからdllファイルを読み込ませようとすると失敗します。 一つ気になるのが、Microsoftのホームページの以下のアドレスでその事に関する対策が載っているようです http://support.microsoft.com/kb/891401/ja この問題を解決するには、最新バージョンの Windows スクリプト ホストを使用してコンピュータを更新します。これを行うには、次のマイクロソフト Web サイトを参照してください。 解決方法としてこのように載っていますが、リンク先がありません。 何かしらどこかにリンク先がないでしょうか? もしくはこの問題を解決できる方法はありませんか? 質問でもなんでもいいので解答ください。 m( )m どうかよろしくお願いいたします。

  • DLLでの例外処理(CException)

    Windows2000上でVC++6.0を使用し、DLLを作成しています。 (AppWizardのWin32DLL/単純なDLLプロジェクトより作成) その中のファイルアクセス時の例外処理で例外が起こっていて、 原因がわからず、困っています。 どなたかおわかりになれば助けてください。 CFileException ex; m_fp = new CStdioFile; if ( ! m_fp->Open( (LPCTSTR)m_csFileName,  //ファイルオープン   CFile::modeWrite    |        // 読み書き両用   CFile::modeNoTruncate |         // 切り捨てなし   CFile::modeCreate   |          // 新規作成(切り捨てなし)   CFile::typeText    |          // テキスト モード   CFile::shareExclusive ,         // 排他モード   &ex ) ) {                 // 例外     ex.ReportError( MB_OK | MB_ICONEXCLAMATION, 0 ); //エラーメッセージダイアログ表示     delete m_fp;     m_fp = NULL;     return FALSE; } の、CExceptionクラスのReportError関数の中でアサーションエラーが起きているようです。 深いところまで追っていくと、AfxLoadString(nIDS, szFormat)で、 このIDのメッセージリソースが見つからず、メッセージが空のため、アサートで引っかかっている模様。 そもそも、DLLでAfx~系の関数って使えるのでしょうか? 使えないのであれば、例外時のエラーメッセージをとってくる方法が他にあるでしょうか? 申し訳ありませんが、よろしくお願いいたします。