• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:dllのロードアドレスについて)

dllのロードアドレスについて

このQ&Aのポイント
  • C++で作成したアプリケーションを起動すると、不正なdllの基底アドレスによるエラー終了が発生する
  • アプリケーションが実行時にロードするdllの基底アドレスが不正になる理由についての質問
  • dllがロードされる基底アドレスがどのように決まるかについての教授をお願いしたい

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

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.5

MinGWは使用したことないので解決できる情報になるかは不明ですが… >kernel32.dllのiname関数(だと思いますが、、)から、mingwm10.dllにアクセスする際にエラーになっています。 >で、このmingwm10.dllがあやしいアドレス0x003d1000にロードされたdllになります。 Microsoftからシンボル情報をDLしてきたのでしょうか? 私のトコロには入れていないので何とも言えませんが…。 Dependency Walkerと、Visual Studioの呼び出し履歴からあたりを付ける手程度しか。 >ちなみにですが、exeを起動するとmain関数までの一連の流れをご存知でしたらご教授して頂け無いでしょうか? OS内部まで追っているわけではありませんので、先に書いた以上のことは不明です。 検索してみるとそういう情報の書かれたページがあるのではないかと思いますが。 スタートアップルーチンに関しては、ライブラリにもよると思われます。 # VS2005だと、C:\Program Files\Microsoft Visual Studio 8\VC\crt\src\crt0.cに_tmainCRTStartup()とか書かれていますが…。 # これらの関数のあるアドレスがEXEなどのエントリポイントとしてリンクされているようです。

Pkakedashi
質問者

お礼

お礼が遅くなり申し訳ありません。 今回のエラーの調査よりも緊急の作業が入ってしまい、作業が頓挫してしまいました。まだ、未解決ではありますが、再開の目処がまだたたない為、一度締め切らせて頂きます。 何度も貴重なご意見ありがとうございました。

その他の回答 (4)

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

>スタートアップルーチンとは、main関数のことでよろしいでしょうか? >mainまで呼ばれていないので、そこは大丈夫だとおもいます。 OSから起動されてからmain関数を呼ぶまでと、main関数から処理が戻された後の後始末の処理を行うのがスターアップルーチンです。 # C言語ならば、OSから渡されたコマンドラインパラメータをargcやargvに分割したり、環境変数ブロツクのアドレスを受け取ってmain関数に渡すたために準備したりなどなどのいろいろな処理を行う必要があります。 0xc0000005だと、アクセス違反っぽいですが、ポインタ関係とかでおかしかったりしませんか? 他のプログラムに組み込んだ場合は正しく初期化できていて、問題のプログラムに組み込んだ場合だと初期化の順番が正しくない…など。 デバッガから起動したらアクセス違反の発生した場所とか特定できませんか?

Pkakedashi
質問者

補足

ご回答ありがとうございます。 >OSから起動されてからmain関数を呼ぶまでと、main関数から処理が戻された後の後始末の処理を行うのがスターアップルーチンです。 勉強になります。 >デバッガから起動したらアクセス違反の発生した場所とか特定できませんか? kernel32.dllのiname関数(だと思いますが、、)から、mingwm10.dllにアクセスする際にエラーになっています。 で、このmingwm10.dllがあやしいアドレス0x003d1000にロードされたdllになります。 >OSから渡されたコマンドラインパラメータをargcやargvに分割したり、環境変数ブロツクのアドレスを受け取ってmain関数に渡すたために準備したりなどなどのいろいろな処理を行う必要があります。 ちなみにですが、exeを起動するとmain関数までの一連の流れをご存知でしたらご教授して頂け無いでしょうか?

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

>C++で作成したアプリケーションを起動すると、main関数が呼ばれる前に「アプリケーションが正しく初期化されませんでした(0xc0000005)。」というダイアログボックスが表示され、エラー終了してしまうという現象が発生しています。 >但し、このアプリケーションは共通のソースを使用して、条件コンパイルによってGUIの描画部分等が違うといった、複数のアプリを作成することができます。そして、このうちの1つのアプリのみ上記のようなエラーが発生してしまいます。 スタートアップルーチン、またはグローバル変数などに設定しているクラスのコンストラクタで死んでいるのではないでしょうか? あるクラスのコンストラクタを処理するためには、別のクラスのコンストラクタが完了している必要がある。とかそのような感じの。 >0x00300000代にロードされるdllがあります。 必ずしも不正とは限らないかと。 あまり使われることは無いでしょうけど。 Visual Studioでデフォルトのままだと、アプリケーションは0x00400000辺りから、DLLは0x01000000辺り…でしたか。 http://messiah-annex.at.webry.info/200501/article_7.html の下の方にDLLのロードアドレスについて記載されています。 ロードしようとしているアドレスが使用済みの場合はOSが別アドレスに変更します。 その結果、0x00300000に読み込まれたのかも知れません。

Pkakedashi
質問者

補足

ご回答ありがとうございます。 >スタートアップルーチン、またはグローバル変数などに設定しているクラスのコンストラクタで死んでいるのではないでしょうか? >あるクラスのコンストラクタを処理するためには、別のクラスのコンストラクタが完了している必要がある。とかそのような感じの。 スタートアップルーチンとは、main関数のことでよろしいでしょうか? mainまで呼ばれていないので、そこは大丈夫だとおもいます。 グローバル変数の初期化の可能性は有り得るかもしれませんが、現状は、アプリケーションのソースは正常に動くものと、一緒にしているのですが、同様のエラーが発生してしまいます。 (アプリケーション名(自作のdll含む)、ディレクトリの構成が現状違います。自作したdllは正常(だと思うところ)にロードされています。) >ロードしようとしているアドレスが使用済みの場合はOSが別アドレスに変更します。 >その結果、0x00300000に読み込まれたのかも知れません。 なるほど、ロードされたdllに問題というよりは、それ以前にエラー(?)が発生している可能性もあるのですね。確かに、確認したところ、通常ロードされるところに何かしらの値が入っていました。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

単に初期化方法が間違っているなどではないのでしょうか または想定していないデータがDLL渡されたため例外が発生しているとか エラー処理の手抜きしてある部分をたまたまつついてしまったとか そのDLL作者または提供元に問い合わせはしてみたのでしょうか

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.1

開発環境・実行環境は何でしょうか? VCなどであればDLLの読み込みは、 LoadLibraryなどの動的読み込みですか? >コンパイル時のリンクオプション等が間違ってしまっている この可能性は高そうですが、 今までは一度もこの様な現象は起こらなかったのでしょうか?

Pkakedashi
質問者

補足

ご回答ありがとうございます。 >開発環境・実行環境は何でしょうか? >VCなどであればDLLの読み込みは、 LoadLibraryなどの動的読み込みですか? 申し訳ありません。ちょっと省略してしまいました。 開発環境は、VCでは無く、MinGW3.1.0-1 + WideStudio397-4です。 ただ、ちょっと特殊なのですがmainは自分で作成し、WideStudioで作成したクラス等を呼ぶようなつくりになっています。 DLLの読み込みは、暗黙的リンクなので、アプリケーション起動時に自動で読み込まれます。 >今までは一度もこの様な現象は起こらなかったのでしょうか? はい、今まで作成していたものは、このような現象が発生しませんでした。

関連するQ&A

専門家に質問してみよう