• ベストアンサー

DLL のロードの順序

ある EXE(DLL) に暗黙リンクされている複数の DLL があるとき、これらの DLL がロードされる順番はどのようにして設定できるのでしょうか? 具体的には EXE を起動したときに、暗黙リンクされているシステム DLL がロードされるより前に、自作の DLL をロードしたいのです。 よろしくお願いします。

noname#9589
noname#9589

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

リンカに指定した順みたいですね。

noname#9589
質問者

お礼

ありがとうございました

その他の回答 (1)

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.1

> EXE を起動したときに、暗黙リンクされているシステム DLL がロードされるより前に、自作の DLL をロードしたいのです。 DLLのロード順は、 1. 実行可能ファイル (EXE) を含むディレクトリ 2. カレント ディレクトリ 3. Microsoft(R) Windows NT(R) の場合 Windows の 32 ビット システム ディレクトリ (通常は \WINNT35\SYSTEM32) Windows の 16 ビット システム ディレクトリ (通常は \WINNT35\SYSTEM) Microsoft(R) Windows(R) 95 の場合 Windows のシステム ディレクトリ (通常は \WINDOWS\SYSTEM) 4. Windows ディレクトリ (通常は \WINNT35 または \Windows) 5. 環境変数 PATH に設定されているディレクトリ 408409 [VB4] DLL が読み込めない原因と対処方法 http://support.microsoft.com/default.aspx?scid=kb;ja;408409 となっていますので、EXEと同じ場所に自作DLLを置いておけば、そちらがロードされるハズ。 もっと汎用のWindows起動後にロードされるようなDLLがDLLキャッシュなどから読まれている場合には…ちょっとわかりません。

参考URL:
http://support.microsoft.com/default.aspx?scid=kb;ja;408409
noname#9589
質問者

補足

ええと、DLL のパスの検索順ではなく、リンクされている DLL のロード順ということです。 A.EXE に B.DLL, C.DLL がリンクされているときに、必ず B.DLL が先にロードされるようにしたいということなのです。

関連するQ&A

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

    いつもお世話になっております。 現在、アプリケーションのデバッグを行っていて、dllのロードについて不明な点があります。 C++で作成したアプリケーションを起動すると、main関数が呼ばれる前に「アプリケーションが正しく初期化されませんでした(0xc0000005)。」というダイアログボックスが表示され、エラー終了してしまうという現象が発生しています。 但し、このアプリケーションは共通のソースを使用して、条件コンパイルによってGUIの描画部分等が違うといった、複数のアプリを作成することができます。そして、このうちの1つのアプリのみ上記のようなエラーが発生してしまいます。 デバッガによって正常に動くアプリとエラーになるアプリとで、アプリ実行時にロードされるdllの基底アドレスに違いがあるということが分かりました。 ※エラーになる方は、明らかに不正なアドレスにロードされているdllがあります。大抵のdllは0x60000000以降のアドレスですが、0x00300000代にロードされるdllがあります。 そこで、アプリケーションが実行時にロードするdllの基底アドレスが不正になってしまう理由がわかればと思い質問いたしました。 (コンパイル時のリンクオプション等が間違ってしまっているのかと思っています。。。) そもそも、dllがロードされる基底アドレスがどのように決まるものなのかも分からないのですが、どなたか御教授して頂けないでしょうか? 以上、よろしくお願いします。

  • WNASPI32.DLLのロード

    Easy CD Creatorを使いたいです。 Easy CD Creatorの起動時に、WNASPI32.DLLがロードできませんでした(以下略) というエラーが出ます。 検索すると同様の症状は多く発生しているみたいです。 WNASPI32.DLLはシステムフォルダにあります。 WNASPI32.DLLがWNASPI32.DLLをロードするパスがシステムフォルダ以外なのか、WNASPI32.DLLのファイル自体に問題があるのかも解決のために知りたいです。 他にも役立ちそうな情報を教えてもらいたいです。

  • DLLが LoadLibrary() でロードされたか判断できますか

    VC++6.0でDLLを作成しています。 アプリケーションが自分のDLLを LoadLibrary()でロードしたのか、 LIBリンクでロードしたのか、判断はできるでしょうか。 DLLの処理の中で、LoadLibrary()でロードされた場合と LIBリンクでロードされた場合の処理を分けたいのが目的です。 (LIBリンクの場合、デタッチ時にはメインのスレッドしか動作しないため) <補足> 正式にはどう呼ばれているか解らないのですが、「LIBリンク」は VCの設定でリンクするLIBを指定し、アプリケーションでは DLLが提供する関数名を記述する方法を意味します。

  • 起動時に「MpDBIf.dllのロードに失敗しました」と表示されて困っています

    VistaからWindows7にアップグレードしました。パソコン起動時やエクスプローラを起動するたびに、「MpDBIf.dllのロードに失敗しました」と表示され、動作が止まります。MpDBIf.dllはキャノンの複合機に附属したソフトMultiPASSSuiteに含まれるdllなのですが、キャノンのHPで確認すると、Windows7には非対応であることがわかりました(ちなみにキャノンの複合機は既に使用しておりません、MultiPASSSuiteは、キャノンのHPにはアンインストール方法が書かれているのですが、その方法を試しても削除不能です)。Windows7上からこのソフトをアンインストールできないばかりか、MultiPASSSuiteフォルダも「別のプログラムがこのフォルダ・ファイルを開いている」旨の表示が出て削除できません。スタートアップにも登録されていませんし、msconfigシステム構成を開いても、スタートアップタブには見られません。MpDBIf.dllを検索すると、mptbox.exe mpabout.ini DTM4.dllに記述されていることが分かりました。この、mptbox.exeを読み込んでいそうなものは、システム領域では、C:\Windows\System32\Mpassif.dllとC:\Windows\System32\mfdactif.dllの二つのようなので、これを削除して再起動しましたが、やはり、「MpDBIf.dllのロードに失敗しました」が表示されます。どなたか解決策、ご教示頂けませんでしょうか。

  • RICHED32DLLが壊れた

    ウィルス(Nimda)にやられて、駆除ツール(Fixnimd)で処理し再起動して ワードパッドを起動しましたら、 RICHED32.DLL が壊れているとの警報 が出てしまいました。システムCDからロードすればよいのでは、と思いますが 具体的な方法が分かりませんので、教えて下さい。OSはWindows98se です。

  • dllかlibか

    自作のライブラリの場合は任意で ユーザーが任意のプラグイン読み込めるアプリなら プラグインに関してはdllでしょうが 公共的なライブラリについて 動的ロード推奨か、静的リンクでもいいという線引はどのあたりなのでしょうか 現状では ole32.dll msimg32.dll comctl32.dll comdlg32.dll dsound.dll kernel32.dll shlwapi.dll shell32.dll uxtheme.dll を動的にロードし winmm.lib user32.lib gdi32.lib を静的にリンクしています。 kernel32とかはさすがに静的リンクでもOKでしょうか? あるいはwinmmとかは動的な方がいいでしょうか? なお、対象はWindowsでXP以降とする場合、です。 (Windows以外の場合も教えていただけるとより良いですが) あと、dsound.dll とかについてですが DirectSoundCreate8 だけGetProcAddressすれば あとの struct IDirectSound8; struct IDirectSoundBuffer8; のメンバなどについてはGetProcAddressしなくても使えるようだし リンクエラーにならないのですが、これはどんな感じの仕組みになっているのでしょうか? あるいは、それを気にしなくてもこれは「そうやっておけば問題ない」 としておいてもいいようなものなのでしょうか?

  • DLLの作りかた

    サンプルで配布されたアプリケーションのEXEファイルをDLL化して、自作するアプリケーション上で利用したいと思っています。 DLLってどうやって作成していくのでしょうか? 初心者にとって、この道は険しいでしょうか?

  • dllの取得

    VB2005を使用しています。実行中のシステムで使用しているDLLは Assembly.GetReferencedAssembliesを使用して取得できたのですが、 処理を行う過程で、別のシステム(例:Sample.exe)で実行に必要なDLLを取得する方法がわかりません。 どなたかわかる方がいらっしゃれば是非ご教授ください。 ちなみに、Sample.exeは起動していません。 必要であればProcess.Start()等で一時的に起動しても構いません。 非表示で起動してしまえばいいので… ↓雰囲気的にはこんな感じです。 '指定された実行可能ファイルに必要なDLL一覧を取得 Dim sDllFiles() AS String = XXX.XXXX("C:\Test\Sample.exe")

  • VCやVBで作成したDLLがどのEXEから起動されているか知りたい。

    VBやVCで作成したDLLがそれぞれあります。 それぞれは複数のEXEから起動されます。 DLLの中でどのEXEから起動されたか知りたいんですが なにか方法はありませんか? 起動している関数などにパラメータを追加できない事情がありまして・・・ よろしくお願いします。

  • MSVCP80.dll 

    X-APPLICATION.exe-エントリーポイントが見つかりません プロシージャ エントリポイント ?npos@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@2IBが ダイナミック リンク ライブラリ MSVCP80.dll から見つかりませんでした このエラーはどうしたら解決できるのでしょうか?ソフトが起動できません。 MSVCP80.dllというのをDLして、system32にいれたのですが、解決しませんでした。 何か方法はありますlか? WINDOWS7です。