アプリケーションを正しく開始できませんでした(0xc000007b)


159

1台のPCで開発しているクライアント/サーバーアプリがあります。今では、2つのシリアルポートが必要なので、友人からPCを借りました。

アプリをビルドしてそれを実行またはデバッグしようとすると(Delphi IDEまたはWindowsファイルマネージャーから)、「アプリケーションを正しく起動できませんでした(0xc000007b)」というエラーが表示されます。

Googlingはあまり機能しませんが、これはDelphi固有のものではなく、他のアプリで発生することを示しているようです。これは、64ビットアプリから32ビットDLLを呼び出すこと、またはその逆によって引き起こされたようです。

  • 両方のPCがWindows 7、64ビット
  • どちらにも32ビットしか処理できないDelphi Xe2スターターエディションがあります。
  • このアプリは私のPCでは問題なく動作しますが、私の友人では動作しません
  • 他のDelphiアプリは両方のPCで正常に動作します

これを追跡する方法について誰かにヒントを教えてもらえますか?


6
余談ですが、com0comを使用して単一のPCに仮想シリアルポートをインストールできます。デバッグとテストに最適です。2つの仮想ポートを作成し、構成でそれらをリンクしてから、各ポートでアプリを実行して、互いに通信できるようにします。
レミールボー

1
Windowsイベントログを確認しましたか?Windowsがアプリを失敗させたDLLに関する詳細情報を提供する場合があります。
Luis Carrasco、

1
それは私が疑う行方不明のDLL、通常いくつかのユーティリティ、またはメモリマネージャーです。
mj2008

4
@ mj2008 DLLがないと、別のエラーが発生します。コンピュータにXXXX.dllがないため、プログラムを起動できません。この問題を修正するには、プログラムを再インストールしてください。
デビッドヘ

3
@sndこのエラーはSTATUS_INVALID_IMAGE_FORMATです。システムがその名前のDLLを見つけられない場合、それは得られません。STATUS_INVALID_IMAGE_FORMATDLLが見つかると取得できますが、DLLが破損しているか、ビット数が正しくありません。
David Heffernan 2015

回答:


133

まず、Dependency Walkerを使用して、アプリケーションとその依存関係の間に問題があるかどうかをテストすることをお勧めします


31
Windowsエラーコード(google.de/…)に基づいて、このエラーコードは0xC000007B STATUS_INVALID_IMAGE_FORMATを意味します。
mox

95
これは、32ビットアプリが64ビットDLLを読み込もうとしたことを示す適切な指標です。
レミールボー

4
実際のところ、このエラーコードPDFファイルは優れたソースです。
mox

4
+1と質問者。おかげで、依存関係の歩行者はその日を救った。64ビットDLLを32ビットバージョンに置き換えましたが、現在は機能しています。
モーグはモニカを

6
Dependency Walkerの正しいバージョンを入手していることを確認してください。x86に依存すると、x64バイナリの結果が正しく表示されません。
Andreas Haferburg 2013

53

ロード時間の依存関係を解決できませんでした。これをデバッグする最も簡単な方法は、Dependency Walkerを使用することです。プロファイルオプションを使用して、ロードプロセスの診断出力を取得します。これにより、障害点が特定され、解決策が示されます。

このエラーの最も一般的な原因は、64ビットDLLを32ビットプロセスに、またはその逆にロードしようとすることです。


2
+1。また、32ビットバージョンのディペンデンシーウォーカーを実行し、ロードされたすべてのDLLが32ビットであることを確認してください。64ビットバージョンの依存関係ウォーカーを実行しようとすると、32ビットバージョンも使用している場合でも、VCRedistなどの64ビットDLLが問題なく読み込まれます。
リオーダ2017

12

不足しているdllです。おそらく、COMポートで動作するDLLには、未解決のDLL依存関係があります。Dependency WalkerとWindowsデバッガーを使用できます。たとえば、すべてのmfcライブラリを確認してください。また、nrCommlibを使用することもできます。これは、COMポートを操作するための優れたコンポーネントです。


12

ここで指定されたすべてのものを試し、さらに別の答えを見つけました。アプリケーションを32ビットDLLでコンパイルする必要がありました。ライブラリを32ビットと64ビットの両方でビルドしましたが、PATH64ビットライブラリに設定しました。アプリケーションを再コンパイルした後(コードにもいくつかの変更を加えました)、この恐ろしいエラーが発生し、2日間苦労しました。最後に、他の多くのことを試した後PATH、64ビットDLLの前に32ビットDLLを持つように変更しました(同じ名前です)。そしてそれはうまくいった。ここでは、完全を期すために追加しています。


9

以前の回答で、依存関係ウォーカーを使用するのがよい方法であると述べましたが、私の場合(私のアプリケーションはエラーコードで失敗し続けます)、依存関係ウォーカーは関連しないいくつかのdllを示しました!

最後に、「プロファイル」メニューに移動することでプロファイリングを実行でき、アプリケーションが実行され、問題の原因となっている正確なDLLで停止することがわかりました。パスのために32ビットdllが選択されていることがわかり、修正しました。

ここに画像の説明を入力してください


5

最近、アプリケーション(シリアルポートを使用する)を開発していて、テストしたすべてのマシンで動作するという問題がありましたが、数人がこのエラーを受け取りました。

エラーが発生したすべてのマシンがWin7 x64を実行していて、一度も更新されていないことがわかります。

Windowsアップデートを実行すると、私の特定のケースですべてのマシンが修正されました。


5

Microsoft Visual Studio 2012を使用してクライアント/サーバーアプリを開発するときに同じ問題が発生しました。

Visual Studioを使用してアプリを開発した場合は、新しい(つまり、ソフトウェアが開発されなかったコンピューター)に適切なMicrosoft Visual C ++再頒布可能パッケージがあることを確認する必要があります。適切な場合は、Visual C ++再頒布可能パッケージの適切な年とビットのバージョン(32ビットの場合はx86、64ビットの場合はx64)が必要です。

Visual C ++再頒布可能パッケージは、Visual Studioを使用して構築されたC ++アプリケーションを実行するために必要なランタイムコンポーネントをインストールします。

Visual Studio 2015のVisual C ++再頒布可能パッケージへのリンクは次のとおりです

インストールされているバージョンを確認するには、コントロールパネル->プログラム->プログラムと機能に移動します。

これがこのエラーを取得して修正した方法です。

1)コンピューターでVisual Studio 2012を使用して32ビットアプリケーションを開発しました。私のコンピューターをComputerAと呼びましょう。

2).exeと関連ファイルを、ComputerBと呼ぶ別のコンピューターにインストールしました。

3)ComputerBで.exeを実行すると、エラーメッセージが表示されました。

4)ComputerBでプログラムと機能を確認したが、Visual C ++ 2012再頒布可能パッケージ(x64)が表示されなかった。

5)ComputerBで、Visual C ++ 2012 Redistributableを探し、x64バージョンを選択してインストールしました。

6)ComputerBで、ComputerBで.exeを実行しましたが、エラーメッセージが表示されませんでした。


3

実際には、このエラーは無効な画像形式を示しています。しかし、なぜこれが起こっているのか、そしてエラーコードは通常何を意味しているのですか?実際には、64ビットのWindowsオペレーティングシステム用に作成された、または動作することを目的としたプログラムを実行しようとしているが、コンピューターが32ビットのオペレーティングシステムで実行されている場合に、この問題が発生する可能性があります。

考えられる理由:

  • Microsoft Visual C ++
  • 再起動する必要があります
  • DirectX
  • 。ネットフレームワーク
  • 再インストールする必要があります
  • 管理者としてアプリケーションを実行する必要がある

出典:http : //www.solveinweb.com/solved-the-application-was-unable-to-start-correctly-0xc000007b-click-ok-to-close-the-application/


2

これは、デバッガのデバッグが役立つ場合があるかもしれません。基本的に、ここ指示に従えば、2つのIDEを実行でき、1つはもう1つにデバッグされます。アプリケーションを1つにまとめると、他の方法では見逃してしまうエラーが発生することがあります。それは試みに値します。


2
これはほぼ間違いなくローダーによって報告されたエラーであり、プロセスが開始する前に発生します。したがって、デバッグはオプションではありません。もちろん、ローダーによってエラーが発生したという私の診断は間違っているかもしれません。
David Heffernan、2012年

2

Visual C ++がインストールされていないマシンでVC ++デバッグ実行可能ファイルを実行しようとしたときにエラーが発生しました。リリースバージョンを作成し、それを使用して修正しました。


2

私の場合、DLLをビルドした後(Visual Studio 2015を使用して)DLLの名前を変更したときにエラーが発生し、DLLに依存する実行可能ファイルが予期する名前に一致しました。Dependency Walkerによって表示されるエクスポートされたシンボルのリストの名前を変更した後、空になり、「アプリケーションを正しく起動できませんでした」というエラーメッセージが表示されました。

したがって、Visual Studioリンカーオプションで出力ファイル名を変更することで修正できます。


2

Microsoft.Windows.Common-Controlsに依存していることをアプリケーションに明示しようとしている場合は、これを使用できます。アセンブリに。これは、コモンコントロールライブラリのバージョン6をロードするときに行います。これにより、ビジュアルスタイルがコモンコントロールに適用されます。

おそらく、Windows XP時代からさかのぼってMicrosoftのオリジナルのドキュメントを読み、アプリケーションのマニフェストに次のものを追加しました。

<!-- Dependancy on Common Controls version 6 -->
<dependency>
    <dependentAssembly>
        <assemblyIdentity
                type="win32"
                name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0"
                processorArchitecture="X86"
                publicKeyToken="6595b64144ccf1df"
                language="*"/>
    </dependentAssembly>
</dependency>

Windows XPはOSではなくなり、32ビットアプリケーションではなくなりました。その間に17年間、マイクロソフトはドキュメントを更新しました。次は、マニフェストを更新します。

<!-- Dependancy on Common Controls version 6 -->
<dependency>
    <dependentAssembly>
        <assemblyIdentity
                type="win32"
                name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0"
                processorArchitecture="*"
                publicKeyToken="6595b64144ccf1df"
                language="*"/>
    </dependentAssembly>
</dependency>

レイモンドチェンには、コモンコントロールの素敵な歴史があります。


3
"Windows XPはもはやOSではありません"が私の一日を作りました:D
Victoria

しかし、私はこの質問を'12に戻しました-Windowsアプリにはマニフェストさえありましたか?
Mawg氏は、モニカを

1
@Mawgこれは問題に関連する場合としない場合があります。ただし、Stackoverflowはwikiと知識のredditを組み合わせたものです。あなたが報告した正確なエラーについて知ることは良い一口です。そうは言っても、Windowsアプリには、Windows 2000に戻るアセンブリマニフェストがありました。Windows XP以降では、アセンブリマニフェストが依存関係を宣言していない限り、comctl32.dllの最新バージョンを取得できなくなりました。
Ian Boyd

1

私の個人的なプロジェクトでこの問題を解決しました(Driesに感謝します)。私にとっては、プロジェクトのパスが長すぎたためです。.slnを短いパス(C:/ MyProjects)に保存し、そこからコンパイルした後、エラーなしで実行されました。


1
@jojodmo:実際、「プロジェクトパスが長すぎたのは、私にとってそれはバグハントへの有効な貢献であるように思われます...
Christian Severin


1

この問題に遭遇しました。Windows 10コントロールパネルの[アプリと機能]で[C ++]を検索したところ、ある種の更新が数日前に実行され、VC ++ Redistributable 2012-2017がインストールされたことがわかりました。エラーメッセージが表示されていたアプリはVC ++ 2010のみが必要でした。それらすべてをアンインストールして2010 x86 / x64だけを再インストールしたところ、エラーはなくなり、アプリケーションは期待どおりに機能しました。


1

これは、何らかの理由でx86リソースがx64マシンからロードされた場合に発生する可能性があります。これを明示的に回避するには、このプリプロセッサディレクティブをstdafx.hに追加します(もちろん、私の例では、問題のあるリソースはWindows Common Controls DLLです。

#if defined(_WIN64)
#pragma comment(linker, "\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df'\"")
#endif

1
コモンコントロールはオペレーティングシステムの一部です。オペレーティングシステムは、正しいバージョンをどこからロードするかを認識しています。これはOPの問題を解決するために何もしません。依存関係さえもインストールしません。これは、マニフェストリソースをアプリケーションにコンパイルして、コモンコントロールのバージョン6を使用することだけを行います。プリプロセッサ条件付きも必要ありません。単にを設定すればprocessorArchitecture='*'、それだけです。
IInspectable

1

システム上に複数のバージョンのdllがある可能性があります。システムを検索して調べることができます。パス内のディレクトリの順序を変更するだけで問題が解決する場合があります。これは私の問題でした。(Qtの外部でQt Creator GUIを実行することはできません。「アプリケーションは正しく起動できませんでした(0xc000007b)」エラー

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.