LoadLibraryでAccess Violation 発生

このQ&Aのポイント
  • 開発言語はC++ 開発環境はVisual Studio 6.0 です。exeファイルを作成し、別のマシンでそのexeファイルを動作させたところアプリが落ちてしまいました。Dependency WalkerでプロファイルしたところLoadLibraryで"UNLHA32.DLL"を呼び出した所でAccess Violationのエラーが発生しています。
  • 現象の詳細は以下の通りです。(1)同じアプリで動くマシンと動かないマシンがある。(2)OS依存では無い。(同じOSでも動くマシンと動かないマシンがある)(3)UNLHA32.DLLのバージョンは複数で試しており、またDLLが破損している事も無さそう。(4)ソースコードを少し変更するとアプリが落ちていたマシンでも正常に動くようになる。
  • 具体的な原因や対処法など知恵を貸して頂ければ幸いです。
回答を見る
  • ベストアンサー

LoadLibraryでAccess Violation 発生。

LoadLibraryでAccess Violation 発生。 開発言語はC++ 開発環境はVisual Studio 6.0 です。 exeファイルを作成し、別のマシンでそのexeファイルを動作させたところアプリが落ちてしまいました。 Dependency Walkerでプロファイルしたところ LoadLibraryで"UNLHA32.DLL"を呼び出した所でAccess Violationのエラーが発生しています。 何か原因に心当たりはありますでしょうか? 現象の詳細は以下の通りです。 (1)同じアプリで動くマシンと動かないマシンがある。 (2)OS依存では無い。(同じOSでも動くマシンと動かないマシンがある) (3)UNLHA32.DLLのバージョンは複数で試しており、またDLLが破損している事も無さそう。 (4)ソースコードを少し変更するとアプリが落ちていたマシンでも正常に動くようになる。 例: ○起動しない ---------------------- // UNLHA32.dllを読んでみる m_hUnlha = LoadLibrary( "UNLHA32.dll" ); ---------------------- ○起動する ---------------------- strcmpi("a", "c"); // UNLHA32.dllを読んでみる m_hUnlha = LoadLibrary( "UNLHA32.dll" ); ---------------------- 例の他にLoadLibraryの後のソースに同じ様な変更を加えても正常に動きました。 具体的な原因や対処法など知恵を貸して頂ければ幸いです。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

私の経験からなのですが、Access Violationが出るときは、止った箇所はトリガーにすぎず、真因は別のメモリ関係(確保忘れ、解放忘れ、多重解放など)でした。 その「起動する」の例のように、関係ないコードを入れると、最終的なバイナリが変って回避されたり、逆に発生しやすくなったりします。 デバグビルドで発生したり、逆に発生しなくなったりします。 ですので、いったんそのLoadLibraryは忘れて、他の箇所、特にメモリ関連を中心に確認するのがいいと思います。 (ポインタはNULLで初期化する、確保/解放でのエラーチェック、解放したらNULLを代入したおく、添字の範囲チェック等、面倒でも入れておくとか)

task5963
質問者

お礼

調査進展がありましたのでご報告です。 ご指摘の通り、LoadLibrary自体には問題無く m_hUnlha(グローバル変数)に値を登録する所でAccess Violationが発生しておりました。 以下の様に、ソースを変更したため発覚しました。 ---------- HMODULE hTest; hTest = LoadLibrary( "UNLHA32.dll" ); m_hUnlha = hTest; ←ここでAccess Violation ---------- アセンブラに詳しい者が調査したところ 正常に動いているアプリと動かないアプリでは m_hUnlha = hTestの時に使用しているレジスタが違っていたようです。 原因は不明で、あくまでも予想ですが こちらもご指摘の通り、初期化やメモリの解放などの処理が雑になっており、 おそらくメモリの管理、マッピングに不備があるのでは?と考えています。 継続調査は致しますが、応急処置をし問題をクローズする事になりましたので 質問の方も解決済みとさせて頂きたいと思っています。 中途半端で申し訳ないですがよろしくお願いします。 お付き合いいただきありがとうございました。

task5963
質問者

補足

回答ありがとうございます。 現在、メモリ管理の観点でソースの他の個所を見直しております。 初見のソース・アプリを デバッグのみを担当という事で難航しておりますが…。 何か進展ありましたら、報告します。

その他の回答 (3)

回答No.3

読み込まれているはずだと思っているDLLと、実際に読み込まれているDLLが、異なっている(別々の場所に同じ名前のDLLが存在する)可能性はないでしょうか。 LoadLibraryでDLL名だけを指定すると、決まった順序でフォルダを探しに行きます。(MSDN御参照) 始めに検索されるのはexeと同じフォルダだったと思います。

task5963
質問者

お礼

調査進展がありましたのでご報告です。 kmeeさんへのお礼と同じ文面となりますがご容赦下さい。 ご指摘の通り、LoadLibrary自体には問題無く m_hUnlha(グローバル変数)に値を登録する所でAccess Violationが発生しておりました。 以下の様に、ソースを変更したため発覚しました。 ---------- HMODULE hTest; hTest = LoadLibrary( "UNLHA32.dll" ); m_hUnlha = hTest; ←ここでAccess Violation ---------- アセンブラに詳しい者が調査したところ 正常に動いているアプリと動かないアプリでは m_hUnlha = hTestの時に使用しているレジスタが違っていたようです。 原因は不明で、あくまでも予想ですが こちらもご指摘の通り、初期化やメモリの解放などの処理が雑になっており、 おそらくメモリの管理、マッピングに不備があるのでは?と考えています。 継続調査は致しますが、応急処置をし問題をクローズする事になりましたので 質問の方も解決済みとさせて頂きたいと思っています。 中途半端で申し訳ないですがよろしくお願いします。 お付き合いいただきありがとうございました。

task5963
質問者

補足

回答ありがとうございます。 DLLはexeと同フォルダに置いています。 また、MSDNのリファレンスを見て、他の参照場所にDLLは無い事を確認しました。 そのため、おそらく読み込んでいるDLLはあっているのではないかと思っています。

回答No.2

こんちは 上記現象は解決できませんが、面倒くさくても、該当の部分だけの 簡単なプログラムを作成し、複数のPCで実施してみてはどうでしょうか? そして、 1)現象は同じ =>PCの環境依存 2)動く =>作成したソースコードの他の部分に問題がある と、なりまして2)の時には 今あるソースコードから、LHAの部分は当然残して、余計な部分を削除していき 障害が発生しなく(2)の状態)なるまで試す。 ソースコードが膨大ならば、ぐぐって似た現象を探す でしょうか、おちからになれず

task5963
質問者

お礼

調査進展がありましたのでご報告です。 kmeeさんへのお礼と同じ文面となりますがご容赦下さい。 ご指摘の通り、LoadLibrary自体には問題無く m_hUnlha(グローバル変数)に値を登録する所でAccess Violationが発生しておりました。 以下の様に、ソースを変更したため発覚しました。 ---------- HMODULE hTest; hTest = LoadLibrary( "UNLHA32.dll" ); m_hUnlha = hTest; ←ここでAccess Violation ---------- アセンブラに詳しい者が調査したところ 正常に動いているアプリと動かないアプリでは m_hUnlha = hTestの時に使用しているレジスタが違っていたようです。 原因は不明で、あくまでも予想ですが こちらもご指摘の通り、初期化やメモリの解放などの処理が雑になっており、 おそらくメモリの管理、マッピングに不備があるのでは?と考えています。 継続調査は致しますが、応急処置をし問題をクローズする事になりましたので 質問の方も解決済みとさせて頂きたいと思っています。 中途半端で申し訳ないですがよろしくお願いします。 お付き合いいただきありがとうございました。

task5963
質問者

補足

回答ありがとうございます。 簡単なプログラムを作ってみたところ、正常に動いているようでした。 ソースコードは少し大き目なので、 bluecampusさんの回答も参考にプログラムの別の部分も見直してみようと思います。

回答No.1

(4)からLoadLibraryのせいではなく、別の個所で、なにかメモリを壊している可能性が あるかもしれません。 たとえば、 char m_hoge[10]; HANDLE m_handle; というメンバ変数があったとき strcpy(m_hoge, "12345467890"); のような処理があったりすると、m_hogeには1バイト分領域が足りないため、 次のメンバ変数のm_handleの領域まで上書きしてしまうとか。

task5963
質問者

お礼

調査進展がありましたのでご報告です。 kmeeさんへのお礼と同じ文面となりますがご容赦下さい。 ご指摘の通り、LoadLibrary自体には問題無く m_hUnlha(グローバル変数)に値を登録する所でAccess Violationが発生しておりました。 以下の様に、ソースを変更したため発覚しました。 ---------- HMODULE hTest; hTest = LoadLibrary( "UNLHA32.dll" ); m_hUnlha = hTest; ←ここでAccess Violation ---------- アセンブラに詳しい者が調査したところ 正常に動いているアプリと動かないアプリでは m_hUnlha = hTestの時に使用しているレジスタが違っていたようです。 原因は不明で、あくまでも予想ですが こちらもご指摘の通り、初期化やメモリの解放などの処理が雑になっており、 おそらくメモリの管理、マッピングに不備があるのでは?と考えています。 継続調査は致しますが、応急処置をし問題をクローズする事になりましたので 質問の方も解決済みとさせて頂きたいと思っています。 中途半端で申し訳ないですがよろしくお願いします。 お付き合いいただきありがとうございました。

task5963
質問者

補足

回答ありがとうございます。 ご指摘の通り、メモリの領域確保がまずそうなので、 今、別の個所の洗い直しをしているところです。 何か進展ありましたら、また報告いたします。

関連するQ&A

  • LoadLibraryについて

    いつもお世話になっております。 現在、WindowsXP(SP2)、VisualBasic6.0(SP6)を使って開発中です。 他社が作成したソースを解析しているのですが、分からない事があったので教えてください。 hModule = LoadLibrary(strDLLFullPath) として、strDLLFullPathに指定されているDLLを呼び出しているのですが、VBでデバッグしていると、【返り値(hModule)=0】となっています。 ロードに成功すると、アドレス空間に割り振ったDLLのインスタンスハンドルが返って来る筈だから、【0】が帰って来たという事は、ロード出来てないという事ですよね? しかしこのソースをコンパイルして単体のアプリとして動かすと、きちんとハンドルを取得できるのです。 動作環境は同じなのに、なぜこのような違いが生じるのでしょうか? 何か御存知でしたら教えてください。 宜しくお願いします。

  • C言語でのaccess violationについて

    Microsoft Visual C++でプログラムを行っていたのですが、プログラムを実行すると、エラーが発生します。 そこでデバッグを行ったら、 ハンドルされていない例外は”アプリ名.exe”にあります :0xC0000005:Access Violation。 というメッセージが出てきました。 ネットでAccess Violationについて調べたのですが、いまひとつ理解できません。 これはどういうことなのでしょうか?また、解決策をご教授願えないでしょうか? 初心者なので、可能な限り専門用語などを使わない、わかりやすい解説をしていただけると幸いです。お願いします。

  • Access Violationについて

    VC++6.0 MFCダイアログベースアプリを作成しているものです。 メインダイアログの他に別ダイアログを追加しようと思い、 新規にクラスを追加し、ダイアログを作成しました。 メインダイアログに終了ボタンがあり、押下することにより、 OnClose()を呼び、アプリを終了させています。 ここで、終了ボタンを押すと、以下のメッセージが表示されます。 ハンドルされていない例外は*****にあります。 0xC0000005: Access Violation 新規追加したクラス宣言部をコメントアウトすると、例外が発生しませんでした。 VC初心者でして、このエラーがメモリー関係では?とは想像がつくのですが、 どのようにアプリに影響しているのかがわかりません。 Access Violationが発生した時の対処法とかクラスを新規追加したことによる、 影響範囲がどの程度あるのか等、ご教授願えませんでしょうか? よろしくお願い致します。

  • 「EAccess Violation・・・」のApplication Error がでます 

    FXソフトでApplication Error として「Exception EAccess Violation in module VT Trader.exe at 0012EF53.Access Violation at address 0012FF53.Write of address 0012FF53. 」がでます。別のパソコンでは正常に起動するのですが、この原因がわかりません。どなたか教えてください。

  • 例外発生(アクセス違反)

    こんにちは。 VB6で開発した自作アプリを実行すると アプリケーション例外が発生します。 ワトソンログを見ますとc0000005(アクセス違反)となっています。 ただ、コンパイルしなおしたEXEで実行すると問題なくできます。 (プログラム等は一切変更しておりません。) 例外に関しましても発生する場合と、しない場合があり、 頻度も3割くらいです。。。 確証はないのですが、別のパソコン(OS)でコンパイルしたEXE を実行すると必ず例外発生しているような。。。 (複数機能があるのですが、特定のもののみ例外発生します) こういう場合、プログラムに問題ありと考えるべきでしょうか???

  • 【VC++6.0(MFC)】Access Violationの対応の仕方

    いつも大変お世話になっております。 VC++初心者です。 現在、VC++6.0(MFC)で先人が作成したソースを改良しています。 デバグモードで動かすと、 以下のメッセージが表示されるのですが、 どのように対応すればよいか、教えていただけませんでしょうか。 「例外処理 (初回) は XXXX.exe (NTDLL.DLL) にあります: 0xC0000005: Access Violation」 (※XXXXはプロジェクト名です。) (※デバグモードで動かすと同時に上記エラーが出力されます。) 上記のエラーが出ていても動かせるのですが、 デバグモード時に、メニューの「デバッグ」、「例外処理」で 「 Access Violation」の設定を 「ハンドルされてなければ停止」から「常に停止」に変更すると、 最初の画面も開けずに、混合モード画面の 7C95AB0A inc dword ptr [eax+10h] という箇所で必ず止まって、落ちてしまいます。 ここから、どのように対処すればよいか、ご教授頂きたくお願いします。

  • libファイル無しでかつLoadLibraryを使わずにロードする方法

    お世話になります。 現在eMbedded VC でソフト開発を行っています。 今Libファイルが無く、ヘッダファイルとdll本体 だけが有るライブラリがあります。 このライブラリのソースはありません。 このライブラリを使用したい場合、LoadLibraryで動的ロードを行えばよいのですが、 どうしても静的に(Libファイルを用いるときのように)ロードを行いたい場合はどのようにすればよいでしょうか? 例えば ・ヘッダとdllからlibファイルを逆生成して使用する方法 やツールについて 等等・・ (原理的に無理な場合はそのようなご回答もお待ちしております。) お忙しい中ですが、皆様宜しくお願いいたします。

  • DLL内部異常発生時、EXEをまきこまれない

     現在、Windows上で動作する、とあるEXEを開発しています。 <EXE実行環境> OS:Window7 32bit <EXE開発環境> MS VC++2008 ※言語は、C++/CLI <DLL開発環境> MS VC++2008 ※言語は、C++ 私自身が携わっているEXEから、必要に応じて、外部委託したDLLを呼出すことを行っています。 現状、結合テストを行っている最中なのですが、この「DLL」がひどいできで、頻繁に異常終了します。 DLL異常終了で、EXEが巻き込まれてしまう為、テスト者に頻繁に呼出されてしまうのを避けたいのです。(このDLLの開発チームというか、開発者が、そもそもテストしたのかどうか疑っているレベルです) 例えば、EXE側で例外トラップ等をしてやることで、DLL内部で発生した異常を完全に捕らえることは可能でしょうか。 また、別途良い方法はないでしょうか。

  • Access2007で質問をした内容と同様なのですが、Access20

    Access2007で質問をした内容と同様なのですが、Access2000も持っていた為、そちらで実行を行いました。(ふりがなウィザード等) ウィザードを起動すると、Access2007と同様に「DLL読み込みエラー」が発生してしまいます。 原因となる事を考えた所、このマシン(PC)のOSですが元々VistaマシンにWin7をクリーンインストールしている事が原因かと考え付いたのですが、如何でしょうか? 何れにしても、何とかAccessを使用したいと思っておりますので、対処法をご教授願います。

  • DLLをREGSVR32しないで利用する方法について。

    こんにちは。 Visual Basic 6.0でActiveX DLLを作成しました。 REGSVR32で登録して正常に利用できていますが、 レジストリを使わないで動かしたいと思っています。 フリーソフトではレジストリを使わないで動かせるものがありますが、あのようにするにはどうすればよいのでしょうか。 基本的には、exeファイルとdllファイルを同じフォルダへ置いて動けば良いと思っています。 調べるとLoadLibraryを使えば出来そうに書かれていますが、ご存知の方アドバイスを宜しくお願い致します。