เหตุใด DLLs 64 บิตจึงไปที่ System32 และ DLL 32 บิตไปที่ SysWoW64 บน Windows 64 บิต


227

ฉันต้องการทราบว่าเมื่อใดที่เราต้องวางไฟล์ไว้ข้างใต้

C: \ Windows \ System32 หรือ C: \ Windows \ SysWOW64 บนระบบ windows 64 บิต

ฉันมี DLL สองตัวตัวหนึ่งสำหรับ 32 บิตหนึ่งตัวสำหรับ 64 บิต

ฉันคิดว่าฉันวาง DLL แบบ 32 บิตภายใต้ C: \ Windows \ System32 และ DLL 64 บิตภายใต้ C: \ Windows \ SysWOW64

ด้วยความประหลาดใจของฉันมันเป็นวิธีอื่น ๆ ! 32บิตใครไปเป็น C: \ Windows \ SysWOW 64และ64บิต DLL ที่จะเข้าสู่ C: \ Windows \ System 32

สิ่งที่สับสนมาก อะไรคือเหตุผลเบื้องหลังสิ่งนี้


2
นอกจากนี้: Windows ดูในไดเรกทอรีการทำงานปัจจุบันเช่นเดียวกับในเส้นทางของระบบ ไม่มีวิธีระบุเป็นอย่างอื่น โอ้เดี๋ยวก่อน คุณสามารถฝังเส้นทางการค้นหาใน DLL ของคุณ มันเป็นเขตข้อมูลที่มีความยาว 8 ไบต์ ใช่. 8 ตัวอักษร
Jeroen Baert

ดูเหมือนว่าจะไม่เป็นจริงใน Windows 7 การเรียกใช้ไฟล์บน DLL ในไฟล์ system32 C: \ Windows \ system32 \ user32.dll C: \ Windows \ system32 \ user32.dll; PE32 ที่ทำงานได้สำหรับ MS Windows (DLL) (GUI) Intel 80386 32 บิต แต่สำหรับ DLL 64 บิตมันจะพิมพ์ PE32 + ที่ปฏิบัติการได้สำหรับ MS Windows (DLL) (คอนโซล) ชุดประกอบ Mono / .Net โปรดทราบว่า DLL นี้ไม่ใช่ . Net การชุมนุม มันเป็น Native DLL
user877329

การเชื่อมโยงคำถามที่คล้ายกันใน superuser
dma_k

11
ให้สัมภาษณ์กับอดีต Microsoftie (สำหรับคำอธิบายที่จริงจังว่าสิ่งนี้เกิดขึ้นได้อย่างไรดูคำตอบนี้)
Tgr

superuser.com/a/157301/241386 "เหตุผลด้านความเข้ากันได้แบบย้อนหลังแอพพลิเคชั่นมากมายคิดว่าสิ่งที่พวกเขาไม่ควรสันนิษฐานและเส้นทางที่ใช้รหัสยาก"
phuclv

คำตอบ:


225

ฉันเชื่อว่าเจตนาคือการเปลี่ยนชื่อ System32 แต่แอปพลิเคชั่นจำนวนมากที่เขียนโค้ดยากสำหรับเส้นทางนั้นว่ามันเป็นไปไม่ได้ที่จะลบออก

SysWoW64 ไม่ได้มีไว้สำหรับ DLLs ของระบบ 64 บิต แต่จริงๆแล้วมันคือ "Windows on Windows64" ซึ่งหมายถึงบิตที่คุณต้องใช้ในการรันแอพ 32 บิตบน Windows 64 บิต

บทความนี้จะอธิบายเล็กน้อย:

"Windows x64 มีไดเรกทอรี System32 ที่ประกอบด้วย DLL 64 บิต (sic!) ดังนั้นกระบวนการดั้งเดิมที่มีผู้ใช้ 64 คนค้นหา DLL ที่" ของพวกเขา "ที่พวกเขาคาดหวัง: ในโฟลเดอร์ System32 ไดเรกทอรีที่สอง SysWOW64 ประกอบด้วย 32 บิตที่ DLL ตัวเปลี่ยนเส้นทางของระบบไฟล์นั้นใช้เวทย์มนตร์ในการซ่อนไดเรกทอรี System32 จริงสำหรับกระบวนการ 32 บิตและแสดง SysWOW64 ภายใต้ชื่อ System32 "

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


27
อืมฉันเพิ่งเจอเรื่องประหลาดนี้วันนี้ ช่างเป็นสิ่งที่ทำให้เข้าใจผิด
Andy White

16
วิ่งเข้ามาในวันนี้เช่นกัน ... ทำให้สับสน - Glut 32-bit dll เข้าสู่ / SysWOW64, DLL 64 บิตของ Glut เข้าสู่ / System32 ควรมีคนเขียนลงไป ในอินเตอร์เน็ต.
Jeroen Baert

8
ข่าวดีก็คือตัวอย่างของอัจฉริยะวิศวกรรมของ Microsoft นี่คือการบันทึกเอกสารด้วยตนเอง
Spike0xff

8
สิ่งหนึ่งที่ฉันไม่ได้รับคือถ้าระบบไฟล์สามารถบอกได้ว่ามันเป็นแอพ 32 บิตและเปลี่ยนเส้นทางไปยังSysWOW64โฟลเดอร์ทำไมพวกเขาถึงไม่ตรวจสอบแอป 64 บิตและเปลี่ยนเส้นทางไปที่System64!
โคลจอห์นสัน

6
System32 เป็น System DLLs รุ่น Windows 32 บิต ระบบเป็นรุ่น 16 บิต บริษัท เดียวกับที่ให้ Windows 8 ให้ SysWow64 สำหรับ 32 บิต Dll และ System32 สำหรับ Dll 64 บิตเมื่อทำงานบนระบบปฏิบัติการ 64 บิต ในระบบ 64 บิตโฟลเดอร์ System ยังคงเป็นขยะเก่า 16 บิตเฉพาะ System32 ไม่ใช่ 32 บิตตามที่แนะนำและสิ่งของ 32 บิตอยู่ในไดเรกทอรีระบบที่มี 64 ในชื่อ ฉันล้มเหลวในการดูว่าสิ่งนี้จะช่วยให้ทุกคน มันซับซ้อนกว่าสิ่งต่าง ๆ และทำลายทุกสิ่ง ทั้งหมดเพื่อช่วยชีวิตผู้คนจากการดัดแปลงฮาร์ดโค้ด "System32" เป็น "System64" เมื่อแปลงเป็น 64 บิต Idiocy
Armand

26

ฉันควรเพิ่ม: คุณไม่ควรใส่ dll ของคุณไว้ใน \ system32 \ อย่างไรก็ตาม! ปรับเปลี่ยนรหัสของคุณปรับเปลี่ยนการติดตั้งของคุณ ... ค้นหาบ้านสำหรับบิตของคุณที่ไม่ได้อยู่ใต้ c: \ windows \

ตัวอย่างเช่นโปรแกรมติดตั้งของคุณทำให้ DLLs ของคุณเป็น:

\program files\<your app dir>\

or

\program files\common files\<your app name>\

( หมายเหตุ : วิธีที่คุณทำเช่นนี้คือการใช้สภาพแวดล้อม var:% ProgramFiles% หรือ% ProgramFiles (x86)% เพื่อค้นหาตำแหน่งที่ Program Files คือ .... คุณไม่คิดว่ามันคือ c: \ program files \ .. .. )

จากนั้นตั้งค่าแท็กรีจิสทรี:

HKLM\software\<your app name>
-- dllLocation

รหัสที่ใช้ DLLs ของคุณอ่านรีจิสทรีจากนั้นเชื่อมโยงกับ DLLs ในตำแหน่งที่ตั้งนั้นแบบไดนามิก

ด้านบนเป็นวิธีที่ชาญฉลาดที่จะไป

คุณไม่เคยติดตั้ง DLLs ของคุณหรือ Dll บุคคลที่สามใน \ system32 \ หรือ \ syswow64 หากคุณต้องโหลดแบบคงที่คุณใส่ DLLs ของคุณใน exe dir ของคุณ (ที่พวกเขาจะพบ) หากคุณไม่สามารถคาดการณ์ exe dir (เช่น exe อื่น ๆ กำลังจะเรียก dll ของคุณ) คุณอาจต้องใส่ dll dir ของคุณในเส้นทางการค้นหา

system32 และ syswow64 สำหรับไฟล์ที่ให้กับ Windows ... ไม่ใช่สำหรับไฟล์ของคนอื่น เหตุผลเดียวที่ทำให้คนติดนิสัยในการวางสิ่งของเพราะมันมักจะอยู่ในเส้นทางการค้นหาและแอพ / โมดูลจำนวนมากใช้การเชื่อมโยงแบบสแตติก (ดังนั้นหากคุณลงไปจริงๆบาปที่แท้จริงคือการเชื่อมโยงแบบคงที่ - นี่เป็นบาปในรหัสพื้นเมืองและรหัสที่มีการจัดการ - มักจะเชื่อมโยงแบบไดนามิกเสมอ!)


9
+1 ... แต่ฉันต้องการเพิ่มว่าคุณควรใช้ตัวแปรเช่น% PROGRAMFILES% ไม่ใช่ \ Program Files \
Rod MacPherson

ในยุคของ XP มันเป็นวิธีปฏิบัติทั่วไป (และข้อเสนอแนะ) สำหรับนักพัฒนาในการใช้รีจิสทรีสำหรับสิ่งต่าง ๆ ด้วย Windows 7 สิ่งนี้ไม่เป็นความจริงอีกต่อไป! สำหรับเหตุผลของ UAC, เซสชันผู้ใช้หลายครั้ง, เป็นต้นการลงทะเบียนใน Windows 7 ควรจะใช้อย่าง จำกัด
ryyker

@RodMacPherson คำตอบของฉันได้รับการปรับปรุงเพื่อนำข้อเสนอแนะของคุณมาพิจารณา คุณพูดถูก!
Jonesome Reinstate Monica

หลังจากการพิจารณาบางอย่างฉันคิดว่าสิ่งนี้ตอบคำถามได้ดีกว่า - "เราจะต้องวางไฟล์ภายใต้% SYSTEMROOT%" เมื่อใด ไม่เคย คำตอบนี้ไม่ตรงกับความอยากรู้เกี่ยวกับโฟลเดอร์ syswow64 แต่เป็นนักพัฒนาที่ต้องอ่านจริงๆ
โทมัส

7

วิ่งเข้าไปในปัญหาเดียวกันและค้นคว้าสิ่งนี้ไม่กี่นาที

ฉันถูกสอนให้ใช้ Windows 3.1 และ DOS จำวันเหล่านั้นได้หรือไม่ ไม่นานหลังจากที่ฉันทำงานกับคอมพิวเตอร์ Macintosh อย่างเข้มงวดสักระยะหนึ่งจากนั้นก็เริ่มแกว่งกลับไปที่ Windows หลังจากซื้อเครื่อง x64 บิต

มีเหตุผลที่แท้จริงที่อยู่เบื้องหลังการเปลี่ยนแปลงเหล่านี้ (บางคนบอกว่ามีนัยสำคัญทางประวัติศาสตร์) ซึ่งเป็นสิ่งจำเป็นสำหรับโปรแกรมเมอร์เพื่อทำงานต่อไป

การเปลี่ยนแปลงส่วนใหญ่กล่าวถึงข้างต้น:

  • Program Files VS Program Files (x86)

    ในการเริ่มต้นไฟล์ 16/86 บิตถูกเขียนบนโปรเซสเซอร์ Intel '86'

  • System32จริงๆหมายถึงSystem64(บน Windows 64 บิต)

    เมื่อนักพัฒนาซอฟต์แวร์เริ่มทำงานกับ Windows7 เป็นครั้งแรกมีปัญหาความเข้ากันได้หลายอย่างที่แอปพลิเคชันอื่น ๆ เก็บไว้

  • SysWOW64 จริงๆหมายถึง SysWOW32

    เป็นหลักในภาษาอังกฤษธรรมดามันหมายถึง'ของ Windows บน Windows ภายในเครื่อง 64 บิต' แต่ละโฟลเดอร์จะระบุตำแหน่งของ DLLs สำหรับแอปพลิเคชันที่ต้องการใช้

นี่คือลิงก์สองลิงก์ที่มีข้อมูลพื้นฐานที่คุณต้องการ:

หวังว่านี่จะช่วยล้างสิ่งต่างๆ!


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

2
@ Chrispy ทำความสะอาดคำตอบ ในอนาคตคุณควรพิจารณาสิ่งที่ Klas แนะนำและจัดรูปแบบการตอบสนองของคุณเพื่อเพิ่มโอกาสในการโหวต :)
RekindledPhoenix

OP จำเป็นต้องเขียนใหม่ทั้งหมดหรือลบออก มันทำให้เข้าใจผิดและไม่มีประโยชน์จริงๆ
Jonesome Reinstate Monica

5
SysWOW64 หมายถึง: [Sys] tem [W] indows 32- บิต [o] n [W] indows [64] - บิตดังนั้นรูปแบบย่อ SysWoW64 (ซึ่งไม่มีเหตุผลจริงๆและ Microsoft เพิ่งออก System32 สำหรับ 32 บิต stuff และสร้าง System64 จะไม่มีปัญหาด้านความเข้ากันได้สิ่งที่ Microsoft ทำใน sandbox ของ WoW คือการสร้างการเปลี่ยนเส้นทางหน่วยความจำจากการเข้าถึง 32 บิตไปยัง System32 เป็นการร้องขอไปยัง SysWoW64 ... สิ่งนี้ไม่ซับซ้อนกว่าเพียงแค่การเปิดเผย ระบบไฟล์ในดิบที่ไม่มีการแมปใหม่อย่างน่าอัศจรรย์สำหรับแพลตฟอร์มที่แตกต่างกันหรือไม่ตามที่ระบุไว้ในความคิดเห็นก่อนหน้า - Idiocy
Armand

1
คำตอบนำมาซึ่งความเข้าใจผิดมากกว่าความชัดเจนในคำถามความคิดเห็น Armands เป็นคำอธิบายที่ดี
nahab

5

System32 เป็นที่ที่ Windows วางไว้ในอดีต 32 บิต DLLs ทั้งหมดและ System เป็นสำหรับ DLL 16 บิต เมื่อไมโครซอฟท์สร้างระบบปฏิบัติการ 64 บิตทุกคนที่ฉันรู้ว่าคาดว่าไฟล์จะอยู่ภายใต้ System64 แต่ Microsoft ตัดสินใจว่าการวางไฟล์ 64 บิตภายใต้ System32 เหมาะสมแล้ว เหตุผลเดียวที่ฉันสามารถค้นหาได้คือพวกเขาต้องการทุกอย่างที่เป็น 32 บิตเพื่อทำงานใน Windows 64 บิตโดยไม่ต้องเปลี่ยนแปลงอะไรในโปรแกรม - เพียงแค่คอมไพล์ใหม่และก็เสร็จแล้ว วิธีที่พวกเขาแก้ไขปัญหานี้เพื่อให้แอปพลิเคชัน 32 บิตยังคงสามารถทำงานได้คือการสร้างระบบย่อย Windows 32 บิตที่เรียกว่า Windows32 บน Windows64 ดังนั้นตัวย่อ SysWOW64 จึงถูกสร้างขึ้นสำหรับไดเรกทอรีระบบของระบบย่อย 32 บิต Sys นั้นสั้นสำหรับระบบและ WOW64 นั้นสั้นสำหรับ Windows32OnWindows64
เนื่องจาก windows 16 ได้ถูกแยกออกจาก Windows 32 แล้วจึงไม่จำเป็นต้องใช้ Windows 16 ในการเทียบเท่า Windows 64 ภายในระบบย่อย 32 บิตเมื่อโปรแกรมไปใช้ไฟล์จากไดเรกทอรี system32 พวกเขาจะได้รับไฟล์จากไดเรกทอรี SysWOW64 แต่กระบวนการมีข้อบกพร่อง

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


2

คนอื่นทำได้ดีมากในการอธิบายปริศนา ridiculus นี้และฉันคิดว่า Chris Hoffman ทำได้ดียิ่งขึ้นที่นี่: https://www.howtogeek.com/326509/whats-the-difference-between-the- system32 และ syswow64 โฟลเดอร์ในหน้าต่าง /

สองความคิดของฉัน:

  1. เราทุกคนทำผิดพลาดสายตาสั้นในชีวิต เมื่อ Microsoft ตั้งชื่อไดเรกทอรี Win32 DLL ของพวกเขา (ในเวลานั้น) "System32" มันสมเหตุสมผลในเวลานั้น ... พวกเขาไม่ได้คำนึงถึงสิ่งที่จะเกิดขึ้นถ้า / เมื่อรุ่น 64 บิต (หรือ 128 บิต) ของระบบปฏิบัติการของพวกเขาได้รับการพัฒนาในภายหลัง - และปัญหาความเข้ากันได้อย่างมากหลังชื่อไดเรกทอรีจะทำให้ แสงเทียนอยู่หลัง 20-20 เสมอดังนั้นฉันไม่สามารถตำหนิพวกเขา (มากเกินไป) สำหรับความผิดพลาดดังกล่าว ... อย่างไรก็ตามเมื่อ Microsoft พัฒนาระบบปฏิบัติการ 64 บิตในภายหลังแม้ว่าจะได้รับประโยชน์จากการเข้าใจถึงปัญหาแล้วทำไมพวกเขาถึงไม่ทำผิดเพียงสายตาสั้นเดียวกันเท่านั้นอีกต่อไป แต่ทำให้แย่ลงกว่าเดิมด้วยการให้ มันเป็นชื่อที่ทำให้เข้าใจผิด?!? น่าละอายกับพวกเขา !!! ทำไมไม่ลองอย่างน้อยชื่อไดเรกทอรี "SysWin32OnWin64" เพื่อหลีกเลี่ยงความสับสน! ? และจะเกิดอะไรขึ้นในที่สุดเมื่อพวกเขาผลิตระบบปฏิบัติการ 128- บิต ... แล้วพวกเขาจะวาง DLL 32- บิต 64 บิตและ 128 บิตที่ไหน?

  2. ตรรกะทั้งหมดนี้ยังดูเหมือนว่าสมบูรณ์สำหรับฉัน บน Windows รุ่น 32 บิต System32 ประกอบด้วย DLLs 32 บิต บน Windows รุ่น 64 บิต System32 มี DLLs 64 บิต ... เพื่อให้ผู้พัฒนาไม่ต้องทำการเปลี่ยนแปลงรหัสถูกต้องหรือไม่ ปัญหาของตรรกะนี้คือผู้พัฒนาเหล่านี้กำลังสร้างแอป 64 บิตที่ต้องการ DLL 64- บิตหรือกำลังสร้างแอป 32- บิตที่ต้องการ DLL 32- บิต ... ไม่ว่าพวกเขาจะยังคงเมาอยู่หรือเปล่า? ฉันหมายความว่าถ้าพวกเขายังคงทำแอพ 32 บิตเพื่อให้ทำงานบน Windows 64 บิตพวกเขาจะต้องทำการเปลี่ยนรหัสเพื่อค้นหา / อ้างอิง DLL ol '32 บิตเดียวกันพวกเขา เคยใช้มาก่อน (ตอนนี้อยู่ใน SysWOW64) หรือถ้าพวกเขากำลังทำงานบนแอพ 64 บิตพวกเขาจะต้องเขียนแอพเก่าของพวกเขาสำหรับระบบปฏิบัติการใหม่ต่อไป ... ดังนั้นการคอมไพล์ใหม่ / การสร้างใหม่ก็เป็นสิ่งที่จำเป็นต่อไป !!

Microsoft บางครั้งก็ทำให้ฉันเจ็บ

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