แอปพลิเคชันไม่สามารถเริ่มต้นอย่างถูกต้อง (0xc000007b)


159

ฉันมีแอพไคลเอนต์ / เซิร์ฟเวอร์ที่ฉันพัฒนาบนพีซีเครื่องเดียว ตอนนี้มันต้องการพอร์ตอนุกรมสองพอร์ตดังนั้นฉันจึงยืมพีซีจากเพื่อน

เมื่อฉันสร้างแอพและลองเรียกใช้หรือแก้ไขข้อบกพร่อง (ไม่ว่าจะเป็นใน Delphi IDE หรือจากตัวจัดการไฟล์ของ Windows) มันเกิดข้อผิดพลาด "แอปพลิเคชันไม่สามารถเริ่มต้นอย่างถูกต้อง (0xc000007b)"

Googling ไม่ได้นำเสนออะไรมาก แต่ดูเหมือนจะบ่งบอกว่านี่ไม่ใช่สิ่งที่ Delphi เจาะจงและเกิดขึ้นกับแอพอื่น ๆ ดูเหมือนว่าจะเกิดจากการเรียกใช้ DLL 32 บิตจากแอป 64 บิตหรือในทางกลับกัน

  • พีซีทั้งสองเครื่องเป็น Windows 7, 64 บิต
  • ทั้งสองมีรุ่นเริ่มต้น Delphi Xe2 ซึ่งสามารถจัดการได้ 32 บิตเท่านั้น
  • แอพทำงานได้ดีบนพีซีของฉัน แต่ไม่ใช่ในเพื่อนของฉัน
  • แอป Delphi อื่น ๆ ทำงานได้ดีบนพีซีทั้งสองเครื่อง

ทุกคนสามารถให้คำแนะนำฉันเกี่ยวกับวิธีติดตามสิ่งนี้ได้หรือไม่


6
ในหมายเหตุด้านข้างคุณสามารถใช้com0comเพื่อติดตั้งพอร์ตอนุกรมเสมือนบนพีซีเครื่องเดียว เหมาะสำหรับการดีบักและทดสอบเพียงแค่สร้าง 2 พอร์ตเสมือนจริงและเชื่อมโยงเข้าด้วยกันในการกำหนดค่าจากนั้นเรียกใช้แอปของคุณในแต่ละพอร์ตเพื่อให้พวกเขาสามารถพูดคุยกันได้
Remy Lebeau

1
คุณตรวจสอบบันทึกเหตุการณ์ของ Windows หรือไม่ บางครั้ง Windows ให้ข้อมูลเพิ่มเติมเกี่ยวกับ DLL ที่ทำให้แอปพลิเคชันล้มเหลว
Luis Carrasco

1
มันจะเป็น DLL ที่หายไปฉันสงสัยว่ามักจะมียูทิลิตี้บางอย่างหรือแม้กระทั่งตัวจัดการหน่วยความจำ
mj2008

4
@ mj2008 Missing DLL ให้ข้อผิดพลาดอื่น: โปรแกรมไม่สามารถเริ่มได้เนื่องจาก XXXX.dll หายไปจากคอมพิวเตอร์ของคุณ ลองติดตั้งโปรแกรมใหม่เพื่อแก้ไขปัญหานี้
David Heffernan

3
@snd STATUS_INVALID_IMAGE_FORMATข้อผิดพลาดนี้ คุณไม่ได้รับเมื่อระบบไม่สามารถค้นหา DLL ของชื่อนั้นได้ คุณได้รับSTATUS_INVALID_IMAGE_FORMATเมื่อพบ DLL แต่เสียหายหรือมีพยานผิด
David Heffernan

คำตอบ:


133

ในการเริ่มต้นฉันขอแนะนำให้ทดสอบว่ามีปัญหาระหว่างแอปพลิเคชันของคุณกับการอ้างอิงโดยใช้วอล์คเกอร์การพึ่งพาหรือไม่


31
ตามรหัสข้อผิดพลาดของ Windows ( google.de/… ) รหัสข้อผิดพลาดนี้หมายถึง: 0xC000007B STATUS_INVALID_IMAGE_FORMAT
mox

95
ซึ่งเป็นข้อบ่งชี้ที่ดีว่าแอป 32 บิตพยายามโหลด DLL 64 บิต
Remy Lebeau

4
แท้จริงแล้วไฟล์ Pdf รหัสข้อผิดพลาดนี้เป็นแหล่งที่ดีเยี่ยม
mox

4
+1 และแอชเวอร์ ขอบคุณวอล์คเกอร์พึ่งพาอาศัยช่วยชีวิตทั้งวันไว้ ฉันแทนที่ DLL 64 บิตด้วยรุ่น 32 บิตและใช้งานได้ในขณะนี้
Mawg พูดว่าคืนสถานะโมนิก้า

6
ตรวจสอบให้แน่ใจว่าคุณได้รับ Dependency Walker เวอร์ชันที่ถูกต้อง x86 ขึ้นอยู่กับผลลัพธ์ที่ไม่ถูกต้องสำหรับ x64 ไบนารี
Andreas Haferburg

53

ไม่สามารถแก้ไขการขึ้นต่อกันความเร็วในการโหลดได้ วิธีที่ง่ายที่สุดในการแก้ปัญหานี้คือการใช้การอ้างอิง Walker ใช้ตัวเลือกโปรไฟล์เพื่อรับเอาต์พุตการวินิจฉัยของกระบวนการโหลด สิ่งนี้จะระบุจุดที่ล้มเหลวและควรนำคุณไปสู่วิธีแก้ปัญหา

สาเหตุที่พบบ่อยที่สุดของข้อผิดพลาดนี้กำลังพยายามโหลด DLL 64 บิตลงในกระบวนการ 32 บิตหรือกลับกัน


2
+1 นอกจากนี้โปรดทราบว่าคุณควรใช้งาน Walker พึ่งพารุ่น 32 บิตและตรวจสอบให้แน่ใจว่า DLLs ที่โหลดทั้งหมดเป็น 32 บิต ถ้าคุณพยายามเรียกใช้ตัวอ้างอิงรุ่น 64 บิตมันจะโหลด DLLs 64 บิตเช่น VCRedist อย่างมีความสุขแม้ว่าคุณจะมีรุ่น 32 บิตอยู่ก็ตาม
liorda

12

มันเป็น dll ที่หายไป อาจเป็นไปได้ว่า dll ของคุณที่ทำงานกับพอร์ต com มีการพึ่งพา dll ที่ยังไม่ได้แก้ไข คุณสามารถใช้การพึ่งพาวอล์คเกอร์และดีบักเกอร์ windows ตรวจสอบไลบรารี mfc ทั้งหมดตัวอย่างเช่น นอกจากนี้คุณสามารถใช้ nrCommlib - เป็นองค์ประกอบที่ยอดเยี่ยมในการทำงานกับพอร์ต com


12

ฉันลองทุกสิ่งที่ระบุที่นี่และพบคำตอบอื่น ฉันต้องรวบรวมแอปพลิเคชันของฉันด้วย DLL 32- บิต ฉันสร้างห้องสมุดทั้งในแบบ 32 บิตและ 64 บิต แต่มีการPATHตั้งค่าของฉันเป็นห้องสมุด 64 บิต หลังจากที่ฉันรวบรวมแอปพลิเคชันของฉันอีกครั้ง (ด้วยการเปลี่ยนแปลงจำนวนมากในรหัสของฉันเช่นกัน) ฉันพบข้อผิดพลาดที่น่ากลัวและพยายามมาสองวัน ในที่สุดหลังจากลองสิ่งอื่น ๆ อีกหลายอย่างฉันเปลี่ยนPATHเป็น 32- บิต Dll หน้า 64- บิต Dll (พวกเขามีชื่อเดียวกัน) และมันก็ใช้งานได้ ฉันแค่เพิ่มที่นี่เพื่อความสมบูรณ์


9

มันได้รับการกล่าวถึงในคำตอบก่อนหน้านี้ว่าการใช้การพึ่งพาวอล์คเกอร์เป็นวิธีที่จะไปในกรณีของฉัน (ใบสมัครของฉันล้มเหลวด้วยรหัสข้อผิดพลาด), วอล์คเกอร์พึ่งพาพบ dll ไม่กี่ที่ไม่เกี่ยวข้อง!

ในที่สุดก็พบว่าฉันสามารถเรียกใช้การทำโปรไฟล์โดยไปที่เมนู "โปรไฟล์" และมันจะเรียกใช้แอปพลิเคชันและหยุดที่ dll ที่แน่นอนที่ทำให้เกิดปัญหา! ฉันพบ dll 32 บิตที่ถูกเลือกเพราะเส้นทางและแก้ไข

ป้อนคำอธิบายรูปภาพที่นี่


5

ฉันเพิ่งมีปัญหาที่ฉันกำลังพัฒนาแอปพลิเคชัน (ที่ใช้พอร์ตอนุกรม) และทำงานบนเครื่องทั้งหมดที่ฉันทดสอบบน แต่บางคนได้รับข้อผิดพลาดนี้

ปรากฎว่าทุกเครื่องที่ข้อผิดพลาดเกิดขึ้นกำลังทำงาน Win7 x64 และไม่เคยได้รับการปรับปรุง

การเรียกใช้การอัปเดต Windows แก้ไขเครื่องทั้งหมดในกรณีของฉันโดยเฉพาะ


5

ฉันประสบปัญหาเดียวกันในการพัฒนาแอปไคลเอ็นต์เซิร์ฟเวอร์โดยใช้ Microsoft Visual Studio 2012

ถ้าคุณใช้ Visual Studio เพื่อพัฒนาแอพคุณต้องแน่ใจว่าใหม่ (เช่นคอมพิวเตอร์ที่ไม่ได้พัฒนาซอฟแวร์) มี Microsoft Visual C ++ Redistributable Package ที่เหมาะสม ตามความเหมาะสมคุณต้องใช้ปีและเวอร์ชั่นที่ถูกต้อง (เช่น x86 สำหรับ 32 บิตและ x64 สำหรับ 64 บิต) ของแพ็คเกจ Visual C ++ Redistributable

Visual C ++ Redistributable Packages ติดตั้งคอมโพเนนต์รันไทม์ที่จำเป็นสำหรับการเรียกใช้โปรแกรมประยุกต์ C ++ ที่สร้างขึ้นโดยใช้ Visual Studio

นี่คือลิงค์ไปสู่ Visual C ++ Redistributable สำหรับ Visual Studio 2015

คุณสามารถตรวจสอบเวอร์ชันที่ติดตั้งได้โดยไปที่แผงควบคุม -> โปรแกรม -> โปรแกรมและคุณสมบัติ

นี่คือวิธีที่ฉันได้รับข้อผิดพลาดและแก้ไขมัน:

1) ฉันพัฒนาแอปพลิเคชั่น 32 บิตโดยใช้ Visual Studio 2012 บนคอมพิวเตอร์ของฉัน เรียกคอมพิวเตอร์ของฉันว่า ComputerA

2) ฉันติดตั้ง. exe และไฟล์ที่เกี่ยวข้องในคอมพิวเตอร์เครื่องอื่นเราจะเรียก ComputerB

3) ที่ ComputerB ฉันใช้งาน. exe และได้รับข้อความแสดงข้อผิดพลาด

4) บน ComputerB ฉันดูที่โปรแกรมและฟีเจอร์และไม่เห็น Visual C ++ 2012 Redistributable (x64)

5) ใน ComputerB ฉัน googled สำหรับ Visual C ++ 2012 Redistributable และเลือกและติดตั้งรุ่น x64

6) ใน ComputerB ฉันรัน. exe บน ComputerB และไม่ได้รับข้อความแสดงข้อผิดพลาด


3

ที่จริงแล้วข้อผิดพลาดนี้ระบุว่าเป็นรูปแบบภาพที่ไม่ถูกต้อง อย่างไรก็ตามเหตุใดจึงเป็นเช่นนี้และรหัสข้อผิดพลาดมักจะหมายถึงอะไร ที่จริงเรื่องนี้อาจปรากฏขึ้นเมื่อคุณพยายามเรียกใช้โปรแกรมที่สร้างขึ้นมาหรือตั้งใจที่จะทำงานกับระบบปฏิบัติการ Windows 64 บิต แต่คอมพิวเตอร์ของคุณทำงานบนระบบปฏิบัติการ 32 บิต

เหตุผลที่เป็นไปได้:

  • Microsoft Visual C ++
  • ต้องรีสตาร์ท
  • DirectX
  • . NET Framework
  • จำเป็นต้องติดตั้งใหม่
  • จำเป็นต้องเรียกใช้แอปพลิเคชันในฐานะผู้ดูแลระบบ

ที่มา: http://www.solveinweb.com/solved-the-application-was-unable-to-start-correctly-0xc000007b-click-ok-to-close-the-application/


2

นี่อาจเป็นกรณีที่การดีบักดีบักอาจมีประโยชน์ เป็นหลักหากคุณทำตามคำแนะนำที่นี่คุณสามารถเรียกใช้สอง IDE และหนึ่งจะแก้ปัญหาในอื่น ๆ หากคุณยกเลิกแอปพลิเคชันของคุณในบางครั้งคุณสามารถตรวจจับข้อผิดพลาดที่คุณพลาดไป มันคุ้มค่าที่จะลอง.


2
นี่เป็นข้อผิดพลาดที่รายงานโดยตัวโหลดและจะเกิดขึ้นก่อนที่กระบวนการจะเริ่ม ดังนั้นการดีบักจะไม่เป็นตัวเลือก แน่นอนฉันอาจผิดในการวินิจฉัยของฉันว่าข้อผิดพลาดเกิดขึ้นจากตัวโหลด
David Heffernan

2

ฉันเห็นข้อผิดพลาดในการพยายามเรียกใช้งานดีบัก VC ++ ที่ทำงานได้บนเครื่องที่ไม่ได้ติดตั้ง Visual C ++ การสร้างเวอร์ชันที่วางจำหน่ายและการใช้ที่แก้ไข


2

ในกรณีของฉันเกิดข้อผิดพลาดเมื่อฉันเปลี่ยนชื่อ DLL หลังจากสร้างมัน (โดยใช้ Visual Studio 2015) เพื่อให้เหมาะกับชื่อที่คาดการณ์ได้จากการปฏิบัติการซึ่งขึ้นอยู่กับ DLL หลังจากเปลี่ยนชื่อรายการสัญลักษณ์ที่ส่งออกที่แสดงโดย Dependency Walker ว่างเปล่าและข้อความแสดงข้อผิดพลาดดังกล่าว "แอปพลิเคชันไม่สามารถเริ่มต้นได้อย่างถูกต้อง" ปรากฏขึ้น

ดังนั้นจึงสามารถแก้ไขได้โดยการเปลี่ยนชื่อไฟล์เอาต์พุตในตัวเลือกลิงค์ของ Visual Studio


2

คุณสามารถมีสิ่งนี้ได้หากคุณพยายามแสดงให้เห็นถึงแอปพลิเคชันของคุณว่ามีการพึ่งพาแอสเซมบลีMicrosoft.Windows.Common- ควบคุม คุณทำสิ่งนี้เมื่อคุณต้องการโหลดไลบรารีการควบคุมทั่วไปเวอร์ชัน 6 เพื่อให้มีการใช้สไตล์ภาพกับตัวควบคุมทั่วไป

คุณอาจปฏิบัติตามเอกสารต้นฉบับของ Microsoft ตั้งแต่วันที่ Windows XP และเพิ่มสิ่งต่อไปนี้ในรายการแอปพลิเคชันของคุณ:

<!-- 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 ไม่ได้เป็นระบบปฏิบัติการอีกต่อไปและคุณไม่ใช่แอปพลิเคชันแบบ 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>

Raymond Chen มีประวัติที่น่ารักของ Common Controls:


3
"Windows XP ไม่ใช่ระบบปฏิบัติการอีกต่อไป"ทำให้วันของฉัน: 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

ดาวน์โหลดและคลายซิปไฟล์ "Dependencies" ในโฟลเดอร์เดียวกันกับที่คุณวางไฟล์ wget.exe ไว้

http://gnuwin32.sourceforge.net/packages/wget.htm

จากนั้นคุณจะมีไฟล์ lib * .dll บางไฟล์รวมถึง wget.exe ในโฟลเดอร์เดียวกันและควรจะทำงานได้ดี

(ฉันตอบด้วยที่นี่https://superuser.com/a/873531/146668ซึ่งฉันพบในตอนแรก)


1

ฉันเพิ่งพบปัญหานี้ ฉันค้นหา "C ++" ภายใต้ "แอพและคุณลักษณะ" ของฉันในแผงควบคุม Windows 10 และพบว่าการอัปเดตบางประเภทเพิ่งใช้งานไปสองสามวันก่อนหน้านี้และติดตั้ง VC ++ Redistributable 2012-2017 แอปที่ทำงานเป็นข้อความแสดงข้อผิดพลาดจำเป็นต้องใช้ VC ++ 2010 เท่านั้นฉันถอนการติดตั้งทั้งหมดแล้วติดตั้งใหม่ในปี 2010 เพียง x86 / x64 และข้อผิดพลาดก็หายไปและแอปพลิเคชันทำงานตามที่คาดไว้


1

สิ่งนี้อาจเกิดขึ้นได้หากมีเหตุผลที่ทำให้ทรัพยากร x86 ถูกโหลดจากเครื่อง x64 เพื่อหลีกเลี่ยงปัญหานี้อย่างชัดเจนให้เพิ่มคำสั่ง preprocessor นี้ไปยัง 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 ของการควบคุมทั่วไป เงื่อนไข preprocessor ยังไม่จำเป็น เพียงตั้งค่าprocessorArchitecture='*'และนั่นคือทั้งหมดที่มีให้
IIsspectable

1

เป็นไปได้ว่าคุณมี dll หลายรุ่นในระบบของคุณ คุณสามารถค้นหาระบบของคุณเพื่อค้นหา ปัญหาอาจแก้ไขได้โดยเพียงแค่เปลี่ยนลำดับของไดเรกทอรีในเส้นทางของคุณ นี่คือปัญหาของฉัน ( ไม่สามารถเรียกใช้ Qt Creator GUI นอก Qt ได้ "ข้อผิดพลาดของแอปพลิเคชันไม่สามารถเริ่มต้นได้อย่างถูกต้อง (0xc000007b)" )

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.