Ứng dụng không thể khởi động chính xác (0xc000007b)


159

Tôi có một ứng dụng khách / máy chủ mà tôi đã phát triển trên một PC. Bây giờ nó cần hai cổng nối tiếp, vì vậy tôi đã mượn một PC từ một người bạn.

Khi tôi xây dựng ứng dụng của mình và cố gắng chạy hoặc gỡ lỗi nó (cho dù trong Delphi IDE hoặc từ Trình quản lý tệp Windows), nó sẽ báo lỗi "Ứng dụng không thể khởi động chính xác (0xc000007b)".

Googling không đưa ra nhiều, nhưng dường như chỉ ra rằng đây không phải là Delphi cụ thể và xảy ra với các ứng dụng khác. Nó dường như được gây ra bằng cách gọi vào một DLL 32 bit từ một ứng dụng 64 bit hoặc ngược lại.

  • cả hai PC là Windows 7, 64 bit
  • cả hai đều có phiên bản khởi động Delphi Xe2 chỉ có thể xử lý 32 bit
  • Ứng dụng chạy tốt trên PC của tôi, nhưng không chạy trên PC của bạn tôi
  • Các ứng dụng Delphi khác chỉ chạy tốt trên cả PC

Bất cứ ai có thể cho tôi một gợi ý về cách theo dõi này?


6
Bên cạnh đó, bạn có thể sử dụng com0com để cài đặt các cổng nối tiếp ảo trên một PC. Tuyệt vời để gỡ lỗi và thử nghiệm, chỉ cần tạo 2 cổng ảo và liên kết chúng với nhau trong cấu hình, sau đó chạy các ứng dụng của bạn trên mỗi cổng để chúng có thể nói chuyện với nhau.
Rémy Lebeau

1
Bạn đã kiểm tra Nhật ký sự kiện Windows chưa? Đôi khi Windows cung cấp thêm thông tin về việc DLL khiến ứng dụng bị lỗi.
Luis Carrasco

1
Nó sẽ là một DLL bị thiếu mà tôi nghi ngờ, thường là một số tiện ích, hoặc thậm chí là trình quản lý bộ nhớ.
mj2008

4
@ mj2008 Thiếu DLL cung cấp một lỗi khác: Chương trình không thể bắt đầu vì thiếu XXXX.dll từ máy tính của bạn. Hãy thử cài đặt lại chương trình để khắc phục vấn đề này.
David Heffernan

3
@snd Lỗi này là STATUS_INVALID_IMAGE_FORMAT. Bạn không hiểu điều đó khi hệ thống không thể tìm thấy DLL của tên đó. Bạn nhận được STATUS_INVALID_IMAGE_FORMATkhi một DLL có thể được tìm thấy, nhưng nó bị hỏng hoặc có bitness sai.
David Heffernan

Câu trả lời:


133

Để bắt đầu, tôi sẽ đề nghị kiểm tra xem có vấn đề nào giữa ứng dụng của bạn và ứng dụng phụ thuộc hay không bằng cách sử dụng walker walker


31
dựa trên Mã lỗi Windows ( google.de/ ,), Mã lỗi này có nghĩa là: 0xC000007B STATUS_INVALID_IMAGE_FORMAT.
mox

95
Đó là một dấu hiệu tốt cho thấy ứng dụng 32 bit đã cố tải DLL 64 bit.
Rémy Lebeau

4
Như một vấn đề thực tế, Tệp Pdf Mã lỗi này là một nguồn tuyệt vời.
mox

4
+1 và aswer. Cảm ơn, người đi bộ phụ thuộc đã tiết kiệm trong ngày. Tôi đã thay thế một DLL 64 bit bằng phiên bản 32 bit và nó hoạt động ngay bây giờ.
Mawg nói rằng phục hồi Monica

6
Hãy chắc chắn rằng bạn đã có phiên bản chính xác của Dependency Walker. Phụ thuộc x86 sẽ hiển thị kết quả không chính xác cho các nhị phân x64.
Andreas Haferburg

53

Một phụ thuộc thời gian tải không thể được giải quyết. Cách dễ nhất để gỡ lỗi này là sử dụng Dependency Walker . Sử dụng tùy chọn Hồ sơ để nhận đầu ra chẩn đoán của quá trình tải. Điều này sẽ xác định điểm thất bại và sẽ hướng dẫn bạn một giải pháp.

Nguyên nhân phổ biến nhất của lỗi này là cố gắng tải DLL 64 bit vào quy trình 32 bit hoặc ngược lại.


2
+1. Cũng lưu ý rằng bạn nên chạy phiên bản 32 bit của walker phụ thuộc và đảm bảo rằng tất cả các DLL được tải là 32 bit. Nếu bạn cố gắng chạy walker phụ thuộc phiên bản 64 bit, nó sẽ vui vẻ tải DLL 64 bit, chẳng hạn như VCRedist, ngay cả khi bạn cũng có phiên bản 32 bit của chúng.
liorda

12

Nó là một dll mất tích. Có thể, dll của bạn hoạt động với các cổng com có ​​sự phụ thuộc dll chưa được giải quyết. Bạn có thể sử dụng walker walker và windows debugger. Kiểm tra tất cả các thư viện mfc, ví dụ. Ngoài ra, bạn có thể sử dụng nrCommlib - nó là thành phần tuyệt vời để làm việc với các cổng com.


12

Tôi đã thử tất cả những điều được chỉ định ở đây và tìm thấy một câu trả lời khác. Tôi đã phải biên dịch ứng dụng của mình với các tệp DLL 32 bit. Tôi đã xây dựng các thư viện cả trong 32 bit và 64 bit nhưng tôi đã PATHthiết lập các thư viện 64 bit. Sau khi tôi biên dịch lại ứng dụng của mình (cũng có một số thay đổi trong mã của tôi), tôi đã gặp phải lỗi đáng sợ này và phải vật lộn trong hai ngày. Cuối cùng, sau khi thử một số thứ khác, tôi đã thay đổi PATHđể có DLL 32 bit trước DLL 64 bit (chúng có cùng tên). Va no đa hoạt động. Tôi chỉ thêm nó ở đây cho đầy đủ.


9

Nó đã được đề cập trong các câu trả lời trước đó rằng sử dụng walker walker là cách tốt nhất, trong trường hợp của tôi (ứng dụng của tôi không thành công với mã lỗi), walker walker cho thấy một vài dll KHÔNG liên quan!

Cuối cùng đã tìm ra rằng tôi có thể chạy hồ sơ bằng cách vào menu "hồ sơ" và nó sẽ chạy ứng dụng và dừng lại ở chính xác điều đó gây ra vấn đề! Tôi phát hiện ra một dll 32 bit đã được chọn vì đường dẫn và sửa nó.

nhập mô tả hình ảnh ở đây


5

Gần đây tôi đã gặp sự cố khi tôi đang phát triển một ứng dụng (sử dụng cổng nối tiếp) và nó đã hoạt động trên tất cả các máy tôi đã thử nghiệm nhưng một vài người đã gặp phải lỗi này.

Hóa ra tất cả các máy xảy ra lỗi khi chạy Win7 x64 và KHÔNG BAO GIỜ được cập nhật.

Chạy bản cập nhật Windows đã sửa tất cả các máy trong trường hợp cụ thể của tôi.


5

Tôi gặp vấn đề tương tự khi phát triển ứng dụng máy khách-máy chủ bằng Microsoft Visual Studio 2012.

Nếu bạn đã sử dụng Visual Studio để phát triển ứng dụng, bạn phải đảm bảo máy tính mới (tức là máy tính mà phần mềm không được phát triển) có Gói Redistributable Microsoft Visual C ++ thích hợp. Nếu thích hợp, bạn cần đúng phiên bản năm và bit (tức là x86 cho 32 bit và x64 cho 64 bit) của Gói phân phối lại Visual C ++.

Gói Redistributable Visual C ++ cài đặt các thành phần thời gian chạy được yêu cầu để chạy các ứng dụng C ++ được xây dựng bằng Visual Studio.

Đây là một liên kết đến Visual C ++ Redistributable cho Visual Studio 2015 .

Bạn có thể kiểm tra phiên bản nào được cài đặt bằng cách vào Bảng điều khiển -> Chương trình -> Chương trình và Tính năng.

Đây là cách tôi gặp lỗi này và sửa nó:

1) Tôi đã phát triển ứng dụng 32 bit bằng Visual Studio 2012 trên máy tính của mình. Hãy gọi cho máy tính của tôi ComputerA.

2) Tôi đã cài đặt .exe và các tệp liên quan trên một máy tính khác, chúng tôi sẽ gọi ComputerB.

3) Trên ComputerB, tôi chạy .exe và nhận được thông báo lỗi.

4) Trên ComputerB, tôi đã xem các Chương trình và Tính năng và không thấy Visual C ++ 2012 Redistributable (x64).

5) Trên ComputerB, tôi đã tìm kiếm Visual C ++ 2012 Redistributable và chọn và cài đặt phiên bản x64.

6) Trên ComputerB, tôi đã chạy .exe trên ComputerB và không nhận được thông báo lỗi.


3

Trên thực tế lỗi này chỉ ra một định dạng hình ảnh không hợp lệ. Tuy nhiên, tại sao điều này xảy ra và mã lỗi thường có nghĩa là gì? Trên thực tế, điều này có thể xuất hiện khi bạn đang cố chạy một chương trình được tạo ra hoặc dự định hoạt động với hệ điều hành Windows 64 bit, nhưng máy tính của bạn đang chạy trên Hệ điều hành 32 bit.

Lý do có thể:

  • Microsoft Visual C ++
  • Cần khởi động lại
  • DirectX
  • .Nền tảng NET
  • Cần cài đặt lại
  • Cần chạy ứng dụng với tư cách quản trị viên

Nguồn: http://www.solveinweb.com/solve-the-application-was-unable-to-start-c chính xác-0xc000007b-click-ok-to-close-the-application/


2

Đây có thể là một trường hợp trong đó gỡ lỗi trình gỡ lỗi có thể hữu ích. Về cơ bản, nếu bạn làm theo các hướng dẫn ở đây, bạn có thể chạy hai ide và một sẽ gỡ lỗi sang cái kia. Nếu bạn hủy ứng dụng của mình trong một, đôi khi bạn có thể bắt gặp các lỗi mà nếu không bạn sẽ bỏ lỡ. Nó đáng để thử.


2
Đây gần như chắc chắn là một lỗi được báo cáo bởi trình tải và do đó xảy ra trước khi quá trình bắt đầu. Do đó gỡ lỗi sẽ không phải là một lựa chọn. Tất nhiên, tôi có thể sai trong chẩn đoán của mình rằng lỗi được đưa ra bởi trình tải.
David Heffernan

2

Tôi đã thấy lỗi khi cố chạy chương trình gỡ lỗi VC ++ trên máy không cài đặt Visual C ++. Xây dựng một phiên bản phát hành và sử dụng nó đã sửa nó.


2

Trong trường hợp của tôi, lỗi xảy ra khi tôi đổi tên DLL sau khi xây dựng nó (sử dụng Visual Studio 2015), để nó phù hợp với tên mà người thực thi mong đợi, phụ thuộc vào DLL. Sau khi đổi tên, danh sách các biểu tượng đã xuất được hiển thị bởi Dependency Walker trống và thông báo lỗi "Ứng dụng không thể khởi động chính xác" được hiển thị.

Vì vậy, nó có thể được sửa bằng cách thay đổi tên tệp đầu ra trong các tùy chọn liên kết Visual Studio.


2

Bạn có thể có điều này nếu bạn đang cố gắng thể hiện ứng dụng của mình rằng nó có phần phụ thuộc vào cụm Microsoft.Windows.Common-Controls . Bạn làm điều này khi bạn muốn tải Phiên bản 6 của thư viện điều khiển chung - để các kiểu trực quan được áp dụng cho các điều khiển chung.

Bạn có thể đã theo dõi tài liệu gốc của Microsoft từ ngày Windows XP và thêm phần sau vào bảng kê khai của ứng dụng của bạn:

<!-- 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 không còn là HĐH và bạn không còn là ứng dụng 32 bit. Trong 17 năm qua, Microsoft đã cập nhật tài liệu của họ ; bây giờ là lúc để bạn cập nhật bảng kê khai của mình:

<!-- 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 có một lịch sử đáng yêu về các Điều khiển chung:


3
"Windows XP không còn là HĐH nữa" đã tạo nên ngày của tôi: D
Victoria

Nhưng tôi đã hỏi lại câu hỏi này trong '12 - các ứng dụng Windows thậm chí còn có các biểu hiện sau đó phải không?
Mawg nói rằng phục hồi Monica

1
@Mawg Điều này có thể có hoặc không liên quan đến vấn đề của bạn. Nhưng với Stackoverflow là sự kết hợp giữa wiki và reddit cho kiến ​​thức; đó là một thông tin tốt để biết chính xác lỗi bạn đã báo cáo. Phải nói rằng, các ứng dụng Windows đã có các bản kê khai lắp ráp quay trở lại Windows 2000; và bắt đầu với Windows XP, bạn sẽ không còn nhận được phiên bản comctl32.dll mới nhất trừ khi bảng kê khai lắp ráp của bạn tuyên bố sự phụ thuộc vào nó.
Ian Boyd

1

Chỉ cần giải quyết vấn đề này cho dự án cá nhân của tôi (cảm ơn Dries vì ​​điều đó). Đối với tôi đó là vì con đường dự án quá dài. Sau khi lưu .sln vào một đường dẫn ngắn hơn (C: / MyProjects) và biên dịch từ đó nó chạy mà không gặp lỗi.


1
@jojodmo: thực ra, "Đối với tôi đó là vì con đường dự án quá dài" đối với tôi dường như là một đóng góp hợp lệ cho việc săn lỗi ...
Christian Severin


1

Tôi chỉ gặp vấn đề này. Tôi đã tìm kiếm "C ++" trong "Ứng dụng & Tính năng" trong bảng điều khiển Windows 10 và nhận thấy rằng một số loại cập nhật chỉ mới chạy vài ngày trước đó và đã cài đặt VC ++ Redistributable 2012-2017. Ứng dụng đang chạy vào thông báo lỗi chỉ yêu cầu VC ++ 2010. Tôi đã gỡ cài đặt tất cả chúng và sau đó cài đặt lại chỉ 2010 x86 / x64, và lỗi đã biến mất và ứng dụng hoạt động như mong đợi.


1

Điều đó có thể xảy ra nếu vì một lý do nào đó, tài nguyên x86 được tải từ máy x64. Để tránh điều đó một cách rõ ràng, hãy thêm chỉ thị tiền xử lý này vào stdafx.h (tất nhiên, trong ví dụ của tôi, tài nguyên có vấn đề là DLL Điều khiển chung của Windows.

#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
Các điều khiển phổ biến là một phần của hệ điều hành. Hệ điều hành biết, tải phiên bản chính xác từ đâu. Điều này không có gì để giải quyết vấn đề của OP. Nó thậm chí không cài đặt một phụ thuộc. Tất cả những gì nó làm là biên dịch một tài nguyên tệp kê khai vào ứng dụng để sử dụng phiên bản 6 của các điều khiển chung. Các điều kiện tiền xử lý cũng không cần thiết. Đơn giản chỉ cần đặt processorArchitecture='*', và đó là tất cả để có nó.
Có thể phát hiện được vào

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.