Uygulama düzgün başlatılamadı (0xc000007b)


159

Tek bir bilgisayarda geliştirdiğim bir istemci / sunucu uygulamam var. Şimdi iki seri port gerekiyor, bu yüzden bir arkadaşımdan bir PC ödünç aldım.

Uygulamamı oluşturup çalıştırmaya veya hata ayıklamaya çalıştığımda (ister Delphi IDE'de ister Windows Dosya yöneticisinden), "Uygulama doğru başlatılamadı (0xc000007b)" hatası veriyor.

Google'da fazla bir şey görünmüyor, ancak bunun Delphi'ye özgü bir şey olmadığını ve diğer uygulamalarda gerçekleştiğini gösteriyor. Bir 64 bit uygulamadan 32 bit DLL çağırmak veya tam tersi gibi görünüyor.

  • her iki bilgisayar da Windows 7, 64 bit
  • her ikisi de sadece 32 bit işleyebilen Delphi Xe2 başlangıç ​​sürümüne sahip
  • Uygulama bilgisayarımda iyi çalışıyor, ancak arkadaşımın
  • Diğer Delphi uygulamaları her iki bilgisayarda da iyi çalışıyor

Birisi bana bunun nasıl izleneceğine dair bir ipucu verebilir mi?


6
Yan notta, sanal seri bağlantı noktalarını tek bir bilgisayara kurmak için com0com kullanabilirsiniz . Hata ayıklama ve test için harika, sadece 2 sanal bağlantı noktası oluşturun ve bunları yapılandırmada birbirine bağlayın, ardından birbirinizle konuşabilmek için uygulamalarınızı her bağlantı noktasında çalıştırın.
Remy Lebeau

1
Windows Olay Günlüğünü kontrol ettiniz mi? Bazen Windows, uygulamanın hangi DLL dosyası başarısız olduğu hakkında daha fazla bilgi sağlar.
Luis Carrasco

1
Bu şüpheli eksik bir DLL, genellikle bazı yardımcı program, hatta bellek yöneticisi olacaktır.
mj2008

4
@ mj2008 Eksik DLL farklı bir hata veriyor: XXXX.dll bilgisayarınızda eksik olduğu için program başlatılamıyor. Bu sorunu gidermek için programı yeniden yüklemeyi deneyin.
David Heffernan

3
@snd Bu hata STATUS_INVALID_IMAGE_FORMAT. Sistem bu adda bir DLL bulamadığında bunu elde edemezsiniz. Sen almak STATUS_INVALID_IMAGE_FORMATbir DLL bulunabilir zaman, ancak bozuk veya yanlış BITNESS sahiptir.
David Heffernan

Yanıtlar:


133

Başlamak için, bağımlılık yürüteç kullanarak uygulamanızla bağımlılıkları arasında bir sorun olup olmadığını test etmenizi öneririm


31
Windows Hata Kodlarına ( google.de/… ) dayanarak , bu Hata Kodu şu anlama gelir: 0xC000007B STATUS_INVALID_IMAGE_FORMAT.
mox

95
Hangi 32-bit app 64-bit DLL yüklemeye çalıştı iyi bir göstergedir.
Remy Lebeau

4
Nitekim, bu Hata Kodu Pdf Dosyası mükemmel bir kaynaktır.
mox

4
+1 ve aswer. Teşekkürler, bağımlılık yürüteç günü kurtardı. 64 bit DLL'yi 32 bit sürümüyle değiştirdim ve şimdi çalışıyor.
Mawg, Monica'nın

6
Dependency Walker'ın doğru sürümüne sahip olduğunuzdan emin olun. X86 bağımlı x64 ikili dosyaları için yanlış sonuçlar görüntüler.
Andreas Haferburg

53

Yükleme süresi bağımlılığı çözülemedi. Bu hata ayıklamanın en kolay yolu Dependency Walker kullanmaktır . Yükleme işleminin tanılama çıktısını almak için Profil seçeneğini kullanın. Bu, arıza noktasını belirleyecek ve sizi bir çözüme yönlendirecektir.

Bu hatanın en yaygın nedeni 32 bitlik bir işleme 64 bit DLL yüklemeye çalışmaktır.


2
+1. Ayrıca bağımlılık yürüteç 32 bit sürümünü çalıştırmak ve yüklü tüm DLL'lerin 32 bit olduğundan emin olun. 64 bit sürüm bağımlılığı yürütücüsünü çalıştırmayı denerseniz, 32 bit sürümleri olsa bile, VCRedist gibi 64 bit DLL'leri mutlu bir şekilde yükleyecektir.
liorda

12

Eksik bir dll olduğunu. Muhtemelen, com bağlantı noktaları ile çalışan dll çözülmemiş dll bağımlılığı var. Bağımlılık yürüteç ve windows hata ayıklayıcı kullanabilirsiniz. Örneğin tüm mfc kütüphanesini kontrol edin. Ayrıca, nrCommlib kullanabilirsiniz - com bağlantı noktaları ile çalışmak için harika bileşenlerdir.


12

Burada belirtilen her şeyi denedim ve başka bir cevap buldum. Uygulamamı 32 bit DLL'lerle derlemek zorunda kaldım. Kütüphaneleri hem 32-bit hem de 64-bit olarak inşa ettim ama PATH64-bit kütüphanelere ayarladım. Başvurumu yeniden derledikten sonra (kodumda da bir dizi değişiklikle) bu korkunç hatayı aldım ve iki gün boyunca mücadele ettim. Son olarak, bir dizi başka şey denedikten sonra PATH, 32-bit DLL'leri 64-bit DLL'lerden önce değiştirdim (aynı isimlere sahipler). Ve işe yaradı. Ben sadece buraya tamlık için ekliyorum.


9

Daha önceki cevaplarda bağımlılık yürüteç kullanarak gitmek için bir yol olduğunu söyledi, benim durumumda (benim uygulama hata kodu ile başarısız devam ediyor), bağımlılık yürüteç ilgili olmayan birkaç dll gösterdi!

Sonunda "profil" menüsüne giderek profilleme çalıştırabileceğini ve uygulamayı çalıştıracak ve soruna neden olan tam dll duracak anladım! Ben bir 32bit dll yolu nedeniyle seçildi öğrendim ve sabit.

resim açıklamasını buraya girin


5

Son zamanlarda bir uygulama geliştirdiğim bir sorun yaşadım (seri bağlantı noktası kullandı) ve test ettiğim tüm makinelerde çalıştı, ancak birkaç kişi bu hatayı alıyordu.

Hatanın meydana geldiği tüm makineleri Win7 x64 çalıştırdığı ve HİÇBİR ZAMAN güncellenmemiş olduğu ortaya çıktı.

Bir Windows güncellemesi çalıştırmak benim durumumdaki tüm makineleri düzeltti.


5

Microsoft Visual Studio 2012 kullanarak bir istemci-sunucu uygulaması geliştirirken de aynı sorunu yaşadım.

Uygulamayı geliştirmek için Visual Studio kullandıysanız, yeni (yani yazılımın geliştirilmediği bilgisayar) uygun Microsoft Visual C ++ Yeniden Dağıtılabilir Paketi'ne sahip olduğundan emin olmalısınız. Uygun olarak, Visual C ++ Yeniden Dağıtılabilir Paketinin doğru yıl ve bit sürümüne (yani 32 bit için x86 ve 64 bit için x64) ihtiyacınız vardır.

Visual C ++ Yeniden Dağıtılabilir Paketleri, Visual Studio kullanılarak oluşturulan C ++ uygulamalarını çalıştırmak için gereken çalışma zamanı bileşenlerini yükler.

İşte Visual Studio 2015 için Visual C ++ Yeniden Dağıtılabilir bağlantısı .

Hangi sürümlerin yüklü olduğunu Kontrol Paneli -> Programlar -> Programlar ve Özellikler'e giderek kontrol edebilirsiniz.

İşte bu hatayı nasıl alıp giderdim:

1) Bilgisayarımda Visual Studio 2012 kullanarak 32 bit uygulama geliştirdim. Bilgisayarıma ComputerA diyelim.

2) .exe ve ilgili dosyaları ComputerB olarak adlandıracağımız farklı bir bilgisayara kurdum.

3) ComputerB üzerinde .exe çalıştırdım ve hata mesajı aldım.

4) ComputerB'de, Programlar ve Özellikler'e baktım ve Visual C ++ 2012 Yeniden Dağıtılabilir'i (x64) görmedim.

5) ComputerB üzerinde, Visual C ++ 2012 Yeniden Dağıtılabilir için googled ve x64 sürümünü seçip yükledim.

6) ComputerB üzerinde, ComputerB üzerinde .exe çalıştırdım ve hata iletisi almadım.


3

Aslında bu hata geçersiz bir görüntü biçimini gösterir. Ancak, bu neden oluyor ve hata kodu genellikle ne anlama geliyor? Aslında bu, 64 bit Windows işletim sistemi için yapılmış veya onunla çalışmak için tasarlanmış bir programı çalıştırmaya çalıştığınızda görünebilir, ancak bilgisayarınız 32 bit İşletim sisteminde çalışıyor.

Olası nedenler:

  • Microsoft Visual C ++
  • Yeniden başlatmanız gerekiyor
  • DirectX
  • .NET Framework
  • Yeniden Yüklemeniz Gerekiyor
  • Uygulamayı yönetici olarak çalıştırmanız gerekiyor

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


2

Bu, hata ayıklayıcıda hata ayıklamanın yararlı olabileceği bir durum olabilir. Esasen buradaki talimatları izlerseniz iki ide çalıştırabilirsiniz ve biri diğerine hata ayıklayacaktır. Uygulamanızda bir uygulama oluşturursanız, bazen başka şekilde kaçırdığınız hataları yakalayabilirsiniz. Denemeye deger.


2
Bu neredeyse kesinlikle yükleyici tarafından bildirilen bir hatadır ve bu nedenle işlem başlamadan önce meydana gelir. Bu nedenle hata ayıklama bir seçenek olmaz. Tabii ki, yükümde hatanın ortaya çıkması teşhisinde yanlış olabilirim.
David Heffernan

2

Visual C ++ yüklü olmayan bir makinede VC ++ hata ayıklama yürütülebilir çalıştırmaya çalışırken hata gördüm. Bir yayın sürümü oluşturmak ve bunu kullanmak düzeltildi.


2

Benim durumumda bir DLL (Visual Studio 2015 kullanarak) oluşturduktan sonra yeniden adlandırdığımda hata oluştu, böylece DLL'ye bağlı bir yürütülebilir dosya tarafından beklenen ada sığacak. Yeniden adlandırma işleminden sonra Dependency Walker tarafından görüntülenen dışa aktarılan sembollerin listesi boştu ve "Uygulama doğru başlatılamadı" hata mesajı görüntülendi.

Bu nedenle, Visual Studio bağlayıcı seçeneklerinde çıktı dosyası adı değiştirilerek düzeltilebilir.


2

Uygulamanızı Microsoft.Windows.Common-Controls derlemesinde bir bağımlılığa sahip olduğunu göstermeye çalışıyorsanız buna sahip olabilirsiniz . Bunu, ortak denetimler kitaplığının Sürüm 6'sını yüklemek istediğinizde yaparsınız; böylece görsel stiller ortak denetimlere uygulanır.

Muhtemelen Microsoft'un orijinal belgelerini Windows XP günlerinden itibaren izlediniz ve uygulamanızın bildirimine aşağıdakileri eklediniz:

<!-- 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 artık işletim sistemi değil ve artık 32 bit bir uygulama değilsiniz. Aradan geçen 17 yıl içinde Microsoft belgelerini güncelledi ; şimdi manifestinizi güncellemenin zamanı geldi:

<!-- 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, Ortak Kontroller hakkında hoş bir geçmişe sahiptir:


3
"Windows XP artık işletim sistemi değil" günümü yaptı: D
Victoria

Ama bu soruyu '12'de sordum - Windows uygulamalarında tezahür bile oldu mu?
Mawg diyor Monica

1
@Mawg Bu, sorununuzla ilgili olabilir veya olmayabilir. Ancak Stackoverflow, bilgi için wiki ve reddit'in bir kombinasyonu olduğu için; tam olarak bildirdiğiniz hatayı bilmek iyi bir fikirdir. Bununla birlikte, Windows uygulamalarının Windows 2000'e geri dönen montaj bildirimleri vardı; ve Windows XP'den başlayarak, derleme bildiriminiz buna bağımlılık bildirmedikçe, comctl32.dll dosyasının en son sürümünü almayacaksınız.
Ian Boyd

1

Kişisel projem için bu sorunu çözdüm (bunun için Dries'e teşekkürler). Benim için bunun nedeni, proje yolunun çok uzun olmasıydı. .Sln dosyasını daha kısa bir yola (C: / MyProjects) kaydettikten ve oradan derledikten sonra hata olmadan çalıştı.


1
@jojodmo: aslında, "Benim için proje yolu çok uzun olduğu için oldu" bana hata avına geçerli bir katkı gibi görünüyor ...
Christian Severin


1

Bu konuya yeni girdim. Windows 10 kontrol panelindeki "Uygulamalar ve Özellikler" altında "C ++" araması yaptım ve bir tür güncellemenin birkaç gün önce çalıştığını ve VC ++ Yeniden Dağıtılabilir 2012-2017'yi yüklediğini fark ettim. Hata mesajında ​​çalışan uygulama sadece VC ++ 2010'u gerektiriyordu. Hepsini kaldırdım ve sadece 2010 x86 / x64'ü yeniden yükledim ve hata gitti ve uygulama beklendiği gibi çalıştı.


1

Herhangi bir nedenden ötürü bir x64 makinesinden bir x86 kaynağı yüklenirse bu gerçekleşebilir. Bunu açıkça önlemek için, bu önişlemci yönergesini stdafx.h dosyasına ekleyin (elbette, örneğimde sorunlu kaynak Windows Common Controls DLL'dir.

#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
Ortak kontroller işletim sisteminin bir parçasıdır. İşletim sistemi doğru sürümü nereden yükleyeceğini bilir. Bu OP'nin sorununu çözmek için hiçbir şey yapmaz. Bir bağımlılık bile kurmaz. Tek yaptığı, ortak kontrollerin 6. sürümünü kullanmak için uygulamaya açık bir kaynak derlemektir. Önişlemci koşuluna da gerek yoktur. Basitçe ayarlayın processorArchitecture='*', hepsi bu kadar.
18'de

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.