Aplikasi tidak dapat memulai dengan benar (0xc000007b)

159

Saya memiliki aplikasi klien / server yang telah saya kembangkan pada satu PC. Sekarang perlu dua port serial, jadi saya meminjam PC dari seorang teman.

Ketika saya membangun aplikasi saya dan mencoba menjalankan atau men-debug-nya (apakah dalam Delphi IDE atau dari Windows File manager), kesalahan "Aplikasi tidak dapat memulai dengan benar (0xc000007b)".

Googling tidak memunculkan banyak hal, tetapi tampaknya menunjukkan bahwa ini bukan hal yang spesifik untuk Delphi dan terjadi dengan aplikasi lain. Tampaknya disebabkan oleh panggilan ke DLL 32 bit dari aplikasi 64 bit atau sebaliknya.

  • kedua PC adalah Windows 7, 64 bit
  • keduanya memiliki edisi pemula Delphi Xe2 yang hanya dapat menangani 32 bit
  • Aplikasi ini berjalan dengan baik di PC saya, tetapi tidak di teman saya
  • Aplikasi Delphi lainnya berjalan dengan baik di kedua PC

Adakah yang bisa memberi saya petunjuk tentang cara melacak ini?

Mawg berkata mengembalikan Monica
sumber
6
Sebagai catatan, Anda dapat menggunakan com0com untuk menginstal port serial virtual pada satu PC. Sangat bagus untuk debugging dan pengujian, cukup buat 2 port virtual dan tautkan bersama-sama dalam konfigurasi, kemudian jalankan aplikasi Anda di setiap port sehingga mereka dapat saling berbicara.
Remy Lebeau
1
Apakah Anda memeriksa Windows Events Log? Terkadang Windows memberikan lebih banyak informasi mengenai DLL mana yang membuat aplikasi gagal.
Luis Carrasco
1
Ini akan menjadi DLL yang hilang saya curiga, biasanya beberapa utilitas, atau bahkan manajer memori.
mj2008
4
@ mj2008 Missing DLL memberikan kesalahan yang berbeda: Program tidak dapat memulai karena XXXX.dll hilang dari komputer Anda. Coba instal ulang program untuk memperbaiki masalah ini.
David Heffernan
3
@nd Kesalahan ini adalah STATUS_INVALID_IMAGE_FORMAT. Anda tidak mendapatkan itu ketika sistem tidak dapat menemukan DLL dari nama itu. Anda dapatkan STATUS_INVALID_IMAGE_FORMATketika DLL dapat ditemukan, tetapi rusak, atau memiliki bitness yang salah.
David Heffernan

Jawaban:

133

Untuk memulai, saya akan menyarankan untuk menguji apakah ada masalah antara aplikasi Anda dan dependensinya menggunakan dependensi walker

mox
sumber
31
berdasarkan pada Kode Kesalahan Windows ( google.de/... ), Kode Kesalahan ini berarti: 0xC000007B STATUS_INVALID_IMAGE_FORMAT.
mox
95
Yang merupakan indikasi yang baik bahwa aplikasi 32-bit mencoba memuat DLL 64-bit.
Remy Lebeau
4
Sebenarnya, File Kesalahan Kode Pdf ini adalah sumber yang sangat baik.
mox
4
+1 dan aswer. Terima kasih, walker ketergantungan menyelamatkan hari. Saya mengganti DLL 64 bit dengan versi 32 bit dan berfungsi sekarang.
Mawg mengatakan mengembalikan Monica
6
Pastikan Anda mendapatkan versi Dependency Walker yang benar. Ketergantungan x86 akan menampilkan hasil yang salah untuk binari x64.
Andreas Haferburg
53

Ketergantungan waktu buka tidak dapat diselesaikan. Cara termudah untuk men-debug ini adalah dengan menggunakan Dependency Walker . Gunakan opsi Profil untuk mendapatkan hasil diagnostik dari proses pemuatan. Ini akan mengidentifikasi titik kegagalan dan akan memandu Anda menuju solusi.

Penyebab paling umum dari kesalahan ini adalah mencoba memuat DLL 64 bit ke dalam proses 32 bit, atau sebaliknya.

David Heffernan
sumber
2
+1. Juga perhatikan bahwa Anda harus menjalankan versi dependensi walker 32 bit, dan memastikan bahwa semua DLL yang dimuat 32 bit. Jika Anda mencoba menjalankan dependensi walker versi 64 bit, ia akan dengan senang hati memuat DLL 64 bit, seperti VCRedist, bahkan jika Anda juga memiliki versi 32 bit mereka.
liorda
12

Ini adalah dll yang hilang. Mungkin, dll Anda yang bekerja dengan port com memiliki ketergantungan dll yang belum terselesaikan. Anda dapat menggunakan dependensi walker dan windows debugger. Periksa semua perpustakaan mfc, misalnya. Anda juga dapat menggunakan nrCommlib - ini adalah komponen yang bagus untuk bekerja dengan port com.

Alex.kononov
sumber
12

Saya mencoba semua hal yang ditentukan di sini dan menemukan jawaban lain. Saya harus mengkompilasi aplikasi saya dengan DLL 32-bit. Saya telah membangun perpustakaan baik dalam 32-bit dan 64-bit tetapi saya telah PATHmenetapkan untuk perpustakaan 64-bit. Setelah saya mengkompilasi ulang aplikasi saya (dengan sejumlah perubahan dalam kode saya juga) saya mendapatkan kesalahan yang menakutkan ini dan berjuang selama dua hari. Akhirnya, setelah mencoba beberapa hal lain, saya mengubah saya PATHuntuk memiliki DLL 32-bit sebelum 64-bit DLL (mereka memiliki nama yang sama). Dan itu berhasil. Saya hanya menambahkannya di sini untuk kelengkapan.

unxnut
sumber
9

Telah disebutkan dalam jawaban sebelumnya bahwa menggunakan dependensi walker adalah cara untuk pergi, dalam kasus saya (aplikasi saya terus gagal dengan kode kesalahan), dependensi walker menunjukkan beberapa dll yang TIDAK relevan!

Akhirnya tahu bahwa saya dapat menjalankan profil dengan pergi ke menu "profil" dan itu akan menjalankan aplikasi dan berhenti di dll yang menyebabkan masalah! Saya menemukan 32bit dll dipilih karena jalur dan memperbaikinya.

masukkan deskripsi gambar di sini

pktCoder
sumber
5

Saya baru-baru ini memiliki masalah ketika saya sedang mengembangkan aplikasi (yang menggunakan port serial) dan bekerja pada semua mesin yang saya uji tetapi beberapa orang mendapatkan kesalahan ini.

Ternyata semua mesin yang mengalami kesalahan menjalankan Win7 x64 dan TIDAK PERNAH SEKALI diperbarui.

Menjalankan pembaruan Windows memperbaiki semua mesin dalam kasus khusus saya.

mitchfish36
sumber
5

Saya mengalami masalah yang sama mengembangkan aplikasi client-server menggunakan Microsoft Visual Studio 2012.

Jika Anda menggunakan Visual Studio untuk mengembangkan aplikasi, Anda harus memastikan yang baru (yaitu komputer tempat perangkat lunak itu tidak dikembangkan) memiliki Paket Microsoft Visual C ++ Redistributable yang sesuai. Dengan tepat, Anda memerlukan versi tahun dan bit yang tepat (yaitu x86 untuk 32 bit dan x64 untuk 64 bit) dari Paket Visual C ++ Redistributable.

Paket Visual C ++ Redistributable menginstal komponen run-time yang diperlukan untuk menjalankan aplikasi C ++ yang dibangun menggunakan Visual Studio.

Berikut ini tautan ke Visual C ++ Redistributable untuk Visual Studio 2015 .

Anda dapat memeriksa versi apa yang diinstal dengan masuk ke Control Panel -> Program -> Program dan Fitur.

Inilah cara saya mendapatkan kesalahan ini dan memperbaikinya:

1) Saya mengembangkan aplikasi 32 bit menggunakan Visual Studio 2012 di komputer saya. Sebut saja komputer saya ComputerA.

2) Saya menginstal .exe dan file terkait di komputer yang berbeda kami akan memanggil ComputerB.

3) Di ComputerB, saya menjalankan .exe dan mendapatkan pesan kesalahan.

4) Di ComputerB, saya melihat Program dan Fitur dan tidak melihat Visual C ++ 2012 Redistributable (x64).

5) Di ComputerB, saya googled untuk Visual C ++ 2012 Redistributable dan memilih dan menginstal versi x64.

6) Di ComputerB, saya menjalankan .exe di ComputerB dan tidak menerima pesan kesalahan.

pengguna3731622
sumber
3

Sebenarnya kesalahan ini menunjukkan ke format gambar tidak valid. Namun, mengapa ini terjadi dan apa arti kode kesalahan biasanya? Sebenarnya ini bisa muncul ketika Anda mencoba menjalankan program yang dibuat untuk atau dimaksudkan untuk bekerja dengan sistem operasi Windows 64 bit, tetapi komputer Anda berjalan pada sistem operasi 32 bit.

Kemungkinan Alasan:

  • Microsoft Visual C ++
  • Harus dimulai ulang
  • DirectX
  • .NET Framework
  • Perlu Menginstal Ulang
  • Perlu Menjalankan aplikasi sebagai administrator

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

Memecahkan101
sumber
2

Ini mungkin merupakan kasus di mana debugging debugger mungkin berguna. Pada dasarnya jika Anda mengikuti instruksi di sini Anda dapat menjalankan dua ide dan satu akan men-debug ke yang lain. Jika Anda menghapus aplikasi Anda dalam satu, Anda kadang-kadang dapat menangkap kesalahan yang sebaliknya Anda lewatkan. Layak untuk dicoba.

Toby Allen
sumber
2
Ini hampir pasti merupakan kesalahan yang dilaporkan oleh loader dan dengan demikian terjadi sebelum proses dimulai. Karenanya debugging tidak akan menjadi pilihan. Tentu saja, dalam diagnosa saya mungkin saya salah bahwa kesalahan muncul oleh loader.
David Heffernan
2

Saya telah melihat kesalahan mencoba menjalankan VC ++ debug yang dapat dieksekusi pada mesin yang tidak memiliki Visual C ++ diinstal. Membangun versi rilis dan menggunakannya untuk memperbaikinya.

Bill Greer
sumber
2

Dalam kasus saya kesalahan terjadi ketika saya mengganti nama DLL setelah membangunnya (menggunakan Visual Studio 2015), sehingga cocok dengan nama yang diharapkan oleh executable, yang tergantung pada DLL. Setelah penamaan ulang daftar simbol yang diekspor yang ditampilkan oleh Dependency Walker kosong, dan pesan galat yang mengatakan "Aplikasi tidak dapat memulai dengan benar" ditampilkan.

Jadi itu bisa diperbaiki dengan mengubah nama file output di opsi Visual Studio linker.

nukleon
sumber
2

Anda dapat memiliki ini jika Anda mencoba untuk mewujudkan aplikasi Anda yang memiliki ketergantungan pada Microsoft.Windows.Common-Controls perakitan . Anda melakukan ini ketika Anda ingin memuat Versi 6 dari perpustakaan kontrol umum - sehingga gaya visual diterapkan ke kontrol umum.

Anda mungkin mengikuti cara dokumentasi asli Microsoft sejak hari-hari Windows XP, dan menambahkan yang berikut ini ke manifes aplikasi Anda:

<!-- 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 bukan lagi OS, dan Anda bukan lagi aplikasi 32-bit. Dalam 17 tahun intervensi Microsoft memperbarui dokumentasi mereka ; sekarang saatnya bagi Anda untuk memperbarui manifes Anda:

<!-- 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>

Raymond Chen memiliki sejarah Kontrol Umum yang indah:

Ian Boyd
sumber
3
"Windows XP bukan lagi OS" dibuat hari saya: D
Victoria
Tapi saya menanyakan pertanyaan ini di tahun '12 - apakah aplikasi Windows bahkan memiliki manifes?
Mawg mengatakan mengembalikan Monica
1
@Mawg Ini mungkin terkait atau tidak dengan masalah Anda. Tetapi dengan Stackoverflow menjadi kombinasi dari wiki dan reddit untuk pengetahuan; itu berita gembira yang baik untuk mengetahui kesalahan yang Anda laporkan. Karena itu, aplikasi Windows telah memiliki manifes perakitan akan kembali ke Windows 2000; dan mulai dengan Windows XP Anda tidak akan lagi mendapatkan versi terbaru dari comctl32.dll kecuali manifes perakitan Anda menyatakan ketergantungan padanya.
Ian Boyd
1

Baru saja menyelesaikan masalah ini untuk proyek pribadi saya (terima kasih kepada Dries untuk itu). Bagi saya itu karena jalur proyek terlalu panjang. Setelah menyimpan .sln ke jalur yang lebih pendek (C: / MyProjects) dan mengkompilasi dari sana ia berjalan tanpa kesalahan.

pengguna1539405
sumber
1
@jojodmo: sebenarnya, "Bagi saya itu karena jalur proyek terlalu panjang" bagi saya tampaknya merupakan kontribusi yang sah untuk perburuan bug ...
Christian Severin
1

Saya baru saja mengalami masalah ini. Saya mencari "C ++" di bawah "Aplikasi & Fitur" saya di panel kontrol Windows 10 dan memperhatikan bahwa beberapa jenis pembaruan baru saja berjalan beberapa hari sebelumnya dan menginstal VC ++ Redistributable 2012-2017. Aplikasi yang menjalankan pesan kesalahan hanya membutuhkan VC ++ 2010. Saya mencopot semuanya dan menginstal ulang 2010 x86 / x64, dan kesalahan hilang dan aplikasi berfungsi seperti yang diharapkan.

Chris Putnam
sumber
1

Itu bisa terjadi jika karena alasan tertentu sumber daya x86 diambil dari mesin x64. Untuk menghindari itu secara eksplisit, tambahkan direktif preprocessor ini ke stdafx.h (tentu saja, dalam contoh saya sumber daya yang bermasalah adalah 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
Michael Haephrati
sumber
1
Kontrol umum adalah bagian dari sistem operasi. Sistem operasi tahu, dari mana memuat versi yang benar. Ini tidak melakukan apa pun untuk menyelesaikan masalah OP. Bahkan tidak menginstal dependensi. Semua yang dilakukannya adalah mengkompilasi sumber daya manifes ke dalam aplikasi untuk menggunakan versi 6 dari kontrol umum. Persyaratan preprosesor juga tidak diperlukan. Cukup atur processorArchitecture='*', dan hanya itu yang ada untuk itu.
IInspectable