แอปพลิเคชันไม่สามารถเริ่มต้นอย่างถูกต้อง (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.