เหตุใด Windows 64 บิตจึงต้องการโฟลเดอร์“ Program Files (x86)” แยกต่างหาก


178

ฉันรู้ว่าใน Windows รุ่น 64 บิตโฟลเดอร์ "Program Files" สำหรับโปรแกรม 64 บิตและโฟลเดอร์ "Program Files (x86)" นั้นใช้สำหรับโปรแกรม 32 บิต แต่ทำไมถึงจำเป็น

โดย "จำเป็น" ฉันไม่ได้หมายความว่า "ทำไม Microsoft ถึงไม่ได้ตัดสินใจออกแบบอื่น ๆ " เพราะแน่นอนพวกเขาสามารถมี แต่ฉันหมายความว่า "ทำไมเมื่อได้รับการออกแบบ Windows 64 บิตในปัจจุบันโปรแกรม 32 บิตต้องมีโฟลเดอร์ระดับบนสุดแยกต่างหากจากโปรแกรม 64 บิต" พูดอีกอย่างหนึ่งว่า "จะเกิดอะไรขึ้นถ้าฉันหลีกเลี่ยงกลไกการเปลี่ยนเส้นทางและบังคับให้ทุกอย่างติดตั้งเป็นของจริงC:\Program Files\"

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

Windows นำเสนอตัวเองแตกต่างจากโปรแกรมที่เรียกว่า "Program Files (x86)" หรือไม่? มีคำอธิบายที่แสดงความแตกต่างของโปรแกรมที่ติดตั้งใน "Program Files (x86)" แทนที่จะเป็น "Program Files" หรือไม่? ฉันคิดว่าไม่น่าเป็นไปได้ที่ Microsoft จะเปิดแฟ้มใหม่โดยไม่มีเหตุผลทางเทคนิคที่ถูกกฎหมาย


13
แทนที่จะตอบคำถามของคุณฉันจะถามคุณจะจัดการไฟล์ \ program files \ common ได้อย่างไร
sgmoore

8
คำตอบเดียวซับ (และด้วยเหตุนี้ความคิดเห็น): เนื่องจากคุณสามารถเรียกใช้โปรแกรมประยุกต์ใด ๆ จากโฟลเดอร์ใด ๆ โดยไม่ต้องรู้สถาปัตยกรรมของมันแล้วไม่มีเหตุผลบังคับชัดเจนสำหรับการแยกนี้ มันเป็นเรื่องของความสะดวกสบายในการสนับสนุนการติดตั้งคู่ของการใช้งานที่มีทั้งสถาปัตยกรรม ในบางกรณีมันสร้างความแตกต่างเพราะพวกเขาไม่จำเป็นต้องเรียบง่าย recompiles ปัญหาหลักคือแอป 32 บิตไม่สามารถโหลด dll 64 บิตได้ดังนั้นโดยทั่วไปคุณจะไม่สามารถติดตั้งทั้งสองเวอร์ชันได้ในที่เดียวกัน อีกทางเลือกหนึ่งคือมีสองโฟลเดอร์ "bin" สำหรับแต่ละแอปพลิเคชัน
Sklivvz

1
@Synetech ฉันยังมีโปรแกรมที่ติดตั้งภายใต้ (x86) เพียงเพื่อมี x64 ไบนารี .. มันน่ากลัวบางครั้ง
sinni800

10
ฉันสงสัยอยู่เสมอว่าทำไม Microsoft ไม่ใส่โปรแกรม 64 บิตใน "Program Files (x64)" แทนที่จะย้าย * "ไดเรกทอรี" ดั้งเดิม "Program Files ไปยัง Program Files (x86)
LawrenceC

30
ระเบียบที่แท้จริงเกี่ยวกับความแตกต่าง 64/32 บิตคือ / Windows / System32 มีเนื้อหา 64 บิตในขณะที่ / Windows / SysWOW64 มีสิ่งที่ 32 บิต ...
poke

คำตอบ:


92

คำตอบสั้น ๆ : เพื่อให้แน่ใจว่าแอปพลิเคชันแบบ 32 บิตแบบดั้งเดิมยังคงทำงานในลักษณะเดียวกับที่เคยใช้โดยไม่ใช้กฎที่น่าเกลียดในแอปพลิเคชัน 64 บิตที่จะสร้างความยุ่งเหยิงถาวร

มันไม่จำเป็น เป็นวิธีที่สะดวกกว่าโซลูชันที่เป็นไปได้อื่น ๆ เช่นต้องการให้ทุกแอปพลิเคชันสร้างวิธีการแยก DLLs 32- บิตและ executables ออกจาก 64- บิต DLLs และ executables

สาเหตุหลักคือการสร้างแอปพลิเคชัน 32 บิตที่ไม่ทราบว่ามีระบบ 64 บิตที่ "เพิ่งทำงาน" แม้ว่าจะมีการติดตั้ง DLL 64- บิตในตำแหน่งที่แอปพลิเคชันอาจดู แอปพลิเคชันแบบ 32 บิตจะไม่สามารถโหลด DLL 64 บิตได้ดังนั้นจำเป็นต้องมีวิธีการเพื่อให้แน่ใจว่าแอปพลิเคชันแบบ 32 บิต (ซึ่งอาจทำให้ระบบ 64- บิตปัจจุบันอยู่แล้วดังนั้นจึงไม่มีความคิดไฟล์ 64 บิต แม้มีอยู่) จะไม่พบ DLL 64 บิตพยายามโหลดล้มเหลวแล้วสร้างข้อความแสดงข้อผิดพลาด

ทางออกที่ง่ายที่สุดสำหรับเรื่องนี้คือการแยกไดเรกทอรีอย่างสม่ำเสมอ ทางเลือกเดียวที่จริง ๆ ก็คือต้องการให้แอปพลิเคชัน 64 บิตทุกตัว "ซ่อน" ไฟล์ที่เรียกใช้งานได้ที่ไหนสักแห่งที่แอปพลิเคชัน 32 บิตจะไม่มองเช่นbin64ไดเรกทอรีภายในแอปพลิเคชันนั้น แต่นั่นจะกำหนดความน่าเกลียดถาวรบนระบบ 64 บิตเพื่อรองรับแอปพลิเคชันรุ่นเก่า


52
พวกเขาไม่จำเป็นต้องกระโดดผ่านห่วงเหล่านี้เพื่ออนุญาตให้โปรแกรม 32- บิตและ 16- บิตในระบบเดียวกัน ฉันจำไม่ได้ว่าเคยเห็นProgramFiles (16)บางอย่างเช่นนั้น นอกจากนี้โปรแกรม 32- บิตจะค้นหา DLL 64 บิตแล้วลองโหลดได้อย่างไร โปรแกรมอะไรไปรอบ ๆ สำหรับการล่าสัตว์ที่กำลังสุ่ม%programfiles%? ถ้าเป็น DLL ที่ใช้ร่วมกันมันจะไปใน WinSxS ถ้ามันไม่ได้ใช้ร่วมกันมันก็ขึ้นอยู่กับโปรแกรมเมอร์ที่จะจัดการ DLLs ของตัวเอง ส่วนเกี่ยวกับมันถูกทำเพื่อความสะดวกสำหรับโปรแกรมเมอร์ที่เหมาะสมว่า
Synetech

30
IIRC Win3.1 ไม่มีไดเรกทอรีไฟล์โปรแกรม (หรือแอพส่วนใหญ่ไม่สนใจ) ดังนั้นจะไม่มีแอพ win16 ใด ๆ ที่กำลังค้นหาสิ่งต่างๆในไฟล์โปรแกรมที่จะเริ่มต้นด้วย แทนที่จะใช้ไลบรารีที่ใช้ร่วมกันของ IIRC บ่อยครั้งก็มีบางแห่งอยู่ในโฟลเดอร์ windows Win32 มี windows \ system และ windows \ system32 เป็นสิ่งประดิษฐ์ของสิ่งนั้น
Dan Neely

15
Windows 3.1 ไม่รองรับชื่อไฟล์ที่ยาวดังนั้นจึงไม่สามารถมีโฟลเดอร์ 'ไฟล์โปรแกรม' ได้
Darth Egregious

14
@JarrodRoberson: ค่อนข้างย้อนกลับเพราะ Microsoft ให้ความสำคัญกับความเข้ากันได้อย่างมาก
David Schwartz

24
@Jarrod: จริงๆแล้วตามที่นักพัฒนาทุกคนรู้ดีว่า Microsoft ให้คุณค่าความเข้ากันได้แบบย้อนหลังสูงเกินไป แท้จริงแล้ว API ทุกตัวของพวกเขามีวิธีดั้งเดิมที่พวกเขาปฏิเสธที่จะลบและมักจะมีข้อบกพร่องร้ายแรงที่พวกเขาปฏิเสธที่จะแก้ไขเพราะพวกเขากลัวที่จะทำลายโปรแกรมรุ่นเก่าที่เขียนขึ้นสำหรับ API นั้น เช่นเดียวกับ API ส่วนใหญ่ แต่ไม่ได้อยู่ใกล้กับ Microsoft
BlueRaja - Danny Pflughoeft

65

อนุญาตให้คุณติดตั้งทั้งแอพพลิเคชั่นรุ่น 32 บิตและ 64 บิตโดยไม่ต้องเขียนทับตัวเอง


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

ฉันไม่ได้ทำงานให้กับ Microsoft และฉันก็ไม่รู้ว่าเหตุผลที่แท้จริงที่อยู่เบื้องหลังโฟลเดอร์เหล่านี้คืออะไร แต่ฉันคิดว่าเหตุผลที่มีโฟลเดอร์เหล่านี้ชัดเจนมากจนฉันไม่มีปัญหาในการโต้แย้ง

งั้นมาทำลายมันกันเถอะ!

  1. โฟลเดอร์น่ากลัว!

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

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

  2. การแยกข้อมูลและตรรกะนั้นยอดเยี่ยม!

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

    พบได้ในระบบไฟล์

    เรามีโฟลเดอร์สำหรับแอปพลิเคชัน (ตรรกะ) และโฟลเดอร์สำหรับของมีค่าของเรา (ข้อมูล):

    ตรรกะ

    • %WINDIR%
    • %PROGRAMFILES%
    • %PROGRAMFILES(x86)%

    ข้อมูล

    • %PROGRAMDATA%
    • %HOMEDRIVE%%HOMEPATH%

    ดังนั้นดูเหมือนว่าโฟลเดอร์จะยอดเยี่ยมและทำให้การใส่โปรแกรมในโฟลเดอร์เล็ก ๆ ของพวกเขาเอง แต่ทำไมถึงมี 2 ทำไมไม่ปล่อยให้ตัวติดตั้งจัดการและใส่ทุกอย่างไว้ในProgramsโฟลเดอร์เดียว?

  3. โปรแกรมติดตั้งไม่ได้วิเศษ

    วันนี้เรามักจะใช้โปรแกรมขนาดเล็กเพื่อติดตั้งโปรแกรมขนาดใหญ่ของเรา เราเรียกโปรแกรมขนาดเล็กเหล่านี้ติดตั้ง

    โปรแกรมติดตั้งไม่ได้วิเศษ พวกเขาจะต้องเขียนโดยโปรแกรมเมอร์และเป็นแอปพลิเคชัน (มีข้อบกพร่องที่เป็นไปได้) เช่นโปรแกรมอื่น ๆ ออกมี ดังนั้นเรามาดูสถานการณ์ที่โปรแกรมเมอร์ในจินตนาการจะต้องเผชิญกับและไม่มีระบบปัจจุบัน:

    1 โฟลเดอร์ไฟล์โปรแกรม

    นักพัฒนารักษา 2 ตัวติดตั้ง หนึ่งสำหรับ 32 บิตและหนึ่งสำหรับรุ่น 64 บิตของแอปพลิเคชันของเขา ติดตั้ง 32bit จะเขียนถึงC:\Program Files\App\และติดตั้ง 64bit C:\Program Files\App\sixtyfour\จะเขียนถึง

    2 โฟลเดอร์ไฟล์โปรแกรม

    นักพัฒนารักษา 1 ตัวติดตั้ง โปรแกรมติดตั้งจะเขียน%PROGRAMFILES%และขึ้นอยู่กับระบบปฏิบัติการเพื่อขยายเส้นทางตาม (คุณไม่ได้ใช้ตัวแปรสภาพแวดล้อมสำหรับกรณีเหล่านี้คุณจะใช้SHGetKnownFolderPathด้วยFOLDERID_ProgramFilesเพื่อดึงเส้นทางที่ถูกต้อง)
    ทุกอย่างที่พบสถานที่ของมันโดยอัตโนมัติและรูปแบบเป็นเหมือนกันกับโปรแกรมที่คุณติดตั้งทุก

  4. ความสอดคล้องทำให้รู้สึก

    เมื่อคุณเรียนรู้บางสิ่งบางอย่างซึ่งมักแสดงถึงพฤติกรรมที่สังเกตได้ว่าสอดคล้องกัน มิฉะนั้นจะไม่มีอะไรให้สังเกตและเรียนรู้จริงๆ

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

    ระบบสำหรับความแตกต่างของแอปพลิเคชัน 32/64 สามารถบรรลุเป้าหมายนี้ได้ แอปพลิเคชันจะถูกแยกออกเป็น 2 ตำแหน่งเพื่อหลีกเลี่ยงความขัดแย้งในชื่อพฤติกรรมการโหลดไบนารีและความปลอดภัย (ในระดับหนึ่ง)

ฉันยังไม่เข้าใจ ดูเหมือนว่าไร้ประโยชน์

คุณไม่ควรลืมสิ่งหนึ่ง คนโง่อย่างไม่น่าเชื่อ ซึ่งรวมถึงผู้ใช้ผู้ใช้ขั้นสูงและโปรแกรมเมอร์โดยเฉพาะ

นี่คือเหตุผลที่เราต้องการสิ่งต่าง ๆ เช่นการเปลี่ยนเส้นทางระบบไฟล์เพื่อให้ระบบของเราใช้งานได้

โปรแกรมเมอร์จะเข้าไปข้างในและพยายามโหลดC:\Windows\system32\awesome.dllและไม่สนใจว่าพวกเขากำลังทำงานบนระบบ 32 หรือ 64 บิต พวกเขาจะพยายามโหลด DLL 64 บิตและก็พัง โปรแกรมเมอร์บางคนต้องการใช้ Office DLL โดยไม่มีปัญหาพวกเขารู้ว่าจะหาได้ที่ไหน! C:\Program Files\Microsoft\Office\14.0\wizards.dll... และความผิดพลาดอื่น!

คำขอทั้งหมดโดยแอปพลิเคชัน 32 บิตจะถูกเปลี่ยนเส้นทางไปยังคู่ 32 บิตเพื่อหลีกเลี่ยงปัญหาแอปพลิเคชันล่ม

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

ตกลงตอนนี้ฉันเข้าใจแล้ว แต่ทำไมไม่ใช้C:\Program Files\x86\ล่ะ?

ตอนนี้เรากำลังได้รับปรัชญา ...

สิ่งที่จะไปผิดถ้าฉันอย่างใดหลีกเลี่ยงกลไกการเปลี่ยนเส้นทางและบังคับให้ทุกอย่างที่จะติดตั้งจริงC:\Program Files\?

เป็นไปได้มากว่าไม่มีอะไร (ตราบใดที่แอปพลิเคชันอื่นไม่ได้ขึ้นอยู่กับตำแหน่งที่แน่นอนสำหรับแอปพลิเคชันนั้น)

WOW64ตะขอกลไกเข้ามาCreateProcessและจะดำเนินการที่มีความซับซ้อนมากขึ้น (ที่มีความซับซ้อนมากขึ้นกว่าการตรวจสอบชื่อโฟลเดอร์ของปฏิบัติการ) การตรวจสอบเกี่ยวกับภาพปฏิบัติการเพื่อตรวจสอบว่าเป็น 32 หรือ 64 บิต

ใช่ แต่ฉันหมายถึงชอบแอปพลิเคชันทั้งหมด!

  • จะเกิดอะไรขึ้นถ้าฉันใส่ทั้งดีเซลและก๊าซลงในรถของฉัน
  • จะเกิดอะไรขึ้นถ้าฉันพยายามใช้ทั้งกระแสสลับและกระแสตรงในบรรทัดเดียวกัน
  • อะไรจะเกิดขึ้นถ้าผมให้ทั้งแมวและปลาของฉันในตู้เดียวกันได้หรือไม่

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


3
นั่นเป็นเหตุผลดั้งเดิมใช่ไหม? ฉันไม่สามารถเพียงแค่ติดตั้งให้แอปC:\Program Files\App32และC:\Program Files\App64?
สตีเฟ่นเจนนิงส์

4
@StephenJennings: แต่นั่นจะทำให้คุณต้องตัดสินใจด้วยตนเอง วิธีการทำงานในขณะนี้คือกระบวนการนี้เป็นแบบอัตโนมัติเนื่องจาก Windows รู้ว่าต้องใช้โฟลเดอร์ใดเมื่อแอปพลิเคชันโทรSHGetSpecialFolderPathหาตำแหน่งการติดตั้ง
Der Hochstapler

6
@Synetech: ทำไมติดตั้ง%PROGRAMFILES%ในสถานที่แรก? ทำไมไม่ใส่เวอร์ชั่น 32 บิตลงบนเดสก์ท็อปของผู้ใช้และ 64 บิตลงในถังรีไซเคิล? เพียงเพราะสามารถทำได้ไม่ได้หมายความว่ามันเป็นความคิดที่ดี ขออภัยฉันไม่ทำตามเหตุผลของคุณ
Der Hochstapler

4
@Synetech: ใช่คุณได้ให้ตัวอย่างที่ดีอย่างสมบูรณ์แบบว่ามันสามารถทำได้ อีกตัวอย่างที่ดีอย่างสมบูรณ์ของวิธีการที่มันสามารถทำได้เป็นวิธีที่มันเป็นจริงที่กำลังทำอยู่ในขณะนี้ เพียงแค่เขียนไฟล์ไปยัง% PROGRAMFILES% และมั่นใจว่ามันจะจบลงในโฟลเดอร์ด้านขวานั่นเป็นสิ่งหนึ่ง ตรวจสอบด้วยตัวคุณเองว่าโฟลเดอร์ไหนที่ถูกต้องอีกโฟลเดอร์หนึ่ง หากคุณไม่เห็นประโยชน์ของวิธีการแบบเดิมฉันจะไม่สามารถโน้มน้าวคุณได้ คำถามคือทำไมมี 2 โฟลเดอร์ ฉันคิดว่าคำตอบของฉันมีเหตุผลอย่างสมบูรณ์แบบในเรื่องนั้น
Der Hochstapler

3
@OliverSalzburg ไม่มาก คำถามคือทำไมสองโฟลเดอร์จะต้องไม่เหตุผลที่มีอยู่ ในความเป็นจริงเขาถึงกับทำตัวกล้า: ทำไมถึงจำเป็น? คุณไม่ได้อธิบายว่าทำไมถึงมีความจำเป็นและตัวอย่างที่ฉันให้ (และแม้กระทั่งตัวอย่างที่เหน็บแนมของคุณ) แสดงให้เห็นว่ามันไม่จำเป็นต้องทำอย่างที่มันเป็น
Synetech

14

TL; DR:

เพื่อสรุปไม่มีก็ไม่จำเป็น ; พวกเขาสามารถใช้โฟลเดอร์เดียวและไม่มี Windows ไม่แสดงตัวตนที่แตกต่างจากโปรแกรมที่กำลังเรียกใช้จากที่หนึ่งหรืออีกที่หนึ่ง


ทุกคนดูเหมือนจะโยนความคิดเห็นของพวกเขาในเรื่องนี้ดังนั้นฉันจะโยนใน 2 my ของฉัน คนอื่นคาดเดาแล้วว่าทำไม Microsoft เลือกสร้างโฟลเดอร์ระดับบนสุดแยกต่างหากสำหรับโปรแกรมรุ่น 32 บิตและ 64 บิตดังนั้นฉันจะออกจากส่วนนั้น (เหตุผลที่ดีที่สุดคือคำอธิบายของ David ว่ามันเป็น อำนวยความสะดวกให้โปรแกรมเมอร์) แน่นอนว่ายังไม่ได้ตอบคำถามโดยตรงว่าทำไมถึงจำเป็น ซึ่งคำตอบคือสันนิษฐานว่า: มันไม่ได้

ฉันจะพูดถึงเนื้อหาหลักของคำถามแทน

Windows นำเสนอตัวเองแตกต่างจากโปรแกรมที่เรียกว่า "Program Files (x86)" หรือไม่?

ไม่ใช่จริง ๆ แต่ตำแหน่งของโปรแกรมอาจมีผลต่อพฤติกรรม แต่ไม่ใช่ในแบบที่คุณคิด

เมื่อคุณเรียกใช้โปรแกรม Windows จะตั้งค่าสภาพแวดล้อมในการใช้งาน (ฉันหมายถึงหน่วยความจำการกำหนดที่อยู่ ฯลฯ ไม่ใช่แค่ตัวแปรสภาพแวดล้อม) สภาพแวดล้อมนี้ขึ้นอยู่กับเนื้อหาของไฟล์เรียกทำงาน (โปรแกรม 32- บิตและ 64- บิตต่างกันภายใน) เมื่อคุณรันโปรแกรม 32 บิตบนระบบ 64 บิตมันจะทำงานในระบบย่อย 32 บิตซึ่งจำลองสภาพแวดล้อมแบบ 32 บิต มันถูกเรียกว่าWOW64 (WOW64 ยืนสำหรับWindows บน Windows 64 บิต ) และมีความคล้ายคลึงกับวิธีการปพลิเคชัน 16 บิตจะทำงานใน XP ใช้NTVDM

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

(ผมใช้คอมพิวเตอร์ที่แตกต่างกันดังนั้นผมจึงไม่สามารถพึ่งพาประวัติเบราเซอร์ของฉันที่จะเปลี่ยนใจขั้นตอนของฉัน แต่วันอื่น ๆ ในขณะที่ตอบคำถามนี้ SUฉันสิ้นสุดขึ้นที่นี้คำถาม SOซึ่งเกิดจากฉันไปGoogle PROCESSOR_ARCHITEW6432ซึ่งนำไปสู่การนี้ดังนั้นคำถามและการโพสต์บล็อกของ Microsoftนี้)

ฉันอ่านโพสต์ StackOverflow เกี่ยวกับวิธีการที่ตัวแปรสภาพแวดล้อม%processor_architecutre% ให้ผลลัพธ์ที่แตกต่างกันขึ้นอยู่กับตำแหน่งที่คุณเรียกใช้พรอมต์คำสั่งจาก (ฉันจะพยายามหาคำพูดที่แน่นอน)

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

สิ่งนี้สมเหตุสมผลเนื่องจากเนื้อหาของไฟล์ที่เรียกใช้งานได้กำหนดว่าเป็น 32- บิตหรือ 64- บิตดังนั้นคุณสามารถใส่ทั้งสำเนา 32 บิตและ 64- บิตของโปรแกรมเดียวกัน (เช่นfoobar32.exeและfoobar64.exe) ในโฟลเดอร์เดียวกันและเมื่อคุณ รันพวกมันจะถูกโหลดอย่างถูกต้อง (เวอร์ชั่น 64- บิตจะถูกเรียกใช้แบบดั้งเดิมและ 32- บิตจะทำงานในเลเยอร์การจำลอง WoW64)

FreePascal ช่วยให้คุณสามารถติดตั้งทั้ง DOS และ Windows %programfiles%\FreePascalรุ่นและพวกเขาไปในโฟลเดอร์เดียวกัน: จะจัดการสถาปัตยกรรมที่แตกต่างกันโดยการเก็บรักษาไฟล์ปฏิบัติการ ( .exe, .sys, .dll, .ovrฯลฯ ) ในโฟลเดอร์ที่แยกต่างหากและแชร์ไฟล์ทรัพยากรเหมือนภาพแหล่งที่มาของไฟล์อื่น ๆ ) ไม่มีเหตุผลทางเทคนิคที่ว่านี้อาจจะยังไม่ได้รับการดำเนินการสำหรับ 32 และเป็น โปรแกรมเวอร์ชัน 64 บิต เช่นเดียวกับ David กล่าวว่ามันง่ายกว่าสำหรับโปรแกรมเมอร์หากแยกไว้ (เช่นการใช้ตัวแปรเพื่อทำให้ดูเหมือนว่ามีไฟล์ชุดเดียวเท่านั้น)


แก้แค้นการลงคะแนนเสียง! Muahahaha! ถอนหายใจ
ซินเทค

ลงคะแนนแปลก ๆ : \. BTW อธิบายได้ดี +1
avirk

11

อีกเหตุผลหนึ่งคือโปรแกรมส่วนใหญ่ที่ใช้ในการใช้ตัวแปรสภาพแวดล้อมเช่น% PROGRAMFILES% เพื่อชี้ไปที่ตำแหน่งที่ติดตั้งโปรแกรม สำหรับโปรแกรม 64 บิตจะไปที่ตำแหน่งปกติ สำหรับโปรแกรม 32 บิตจะเปลี่ยนเส้นทางไปยังProgram Files (x86)โฟลเดอร์ใหม่

แม้ว่าอย่างน้อยกับสิ่งใหม่. Net ใน Visual Studio ตอนนี้พวกเขามีตัวแปร App.Local ที่กำจัดความต้องการทั้งหมดนี้


4
แต่นั่นไม่ได้อธิบาย ใครบ้างที่ใช้ตัวแปรสภาพแวดล้อมและทำไมมันถึงสนใจว่าโปรแกรมเป็น 32- บิตหรือ 64- บิต?
Synetech

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

1
และวิธีการทำ%programfiles%, %programfiles(x86)%หรือ%programw6432%สร้างความแตกต่างที่นั่น? DLLs ที่ใช้ร่วมกันใด ๆ จะเข้าสู่ไดเรกทอรี WinSxS เดียวและ DLL ที่ไม่ได้ใช้ร่วมกันจะอยู่ที่นั่นพร้อมกับปฏิบัติการ สิ่งนี้จะสำคัญถ้าด้วยเหตุผลบางอย่างที่คุณติดตั้งโปรแกรมเดียวกันทั้งรุ่น 32- บิตและ 64- บิตและแม้ว่าคุณจะเก็บ DLLs 32- บิตด้วยไฟล์ปฏิบัติการ 32- บิตและ DLL 64 บิตด้วย ปฏิบัติการ 64- ​​บิต คุณสามารถทำเช่นนี้: %programfiles%\CoolApp\bin\32และ% programfiles% \ CoolApp \ bin \ 64` ทำไมโฟลเดอร์ระดับบนสุดแยกต่างหาก
Synetech

@Synetech แน่นอนมัน; % programfiles% ได้รับในขณะที่ หากคุณติดตั้งโปรแกรม 32 บิตบนคอมพิวเตอร์ 64 บิตการมีที่เดียวจะทำให้เกิดปัญหากับแอป 32 บิตนั้น WoW สามารถเปลี่ยนเส้นทาง% programfile% ไปเป็นเวอร์ชัน (x86) สำหรับแอป 32 บิตและไม่ใช่ x86 สำหรับรุ่น 64
Andy

ฉันคิดว่าผู้คนจะไม่สับสนถ้าไม่มีการเปลี่ยนเส้นทางโดยปริยาย
kommradHomer

8

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

เพื่อช่วยให้การเปลี่ยนแปลงง่ายขึ้น Microsoft ได้กำหนดให้โหลดแอปพลิเคชัน 32 บิตทั้งหมดลงในโฟลเดอร์ Program Files (x86) แทนที่จะรวมกับแอปพลิเคชัน 64- บิตที่แท้จริงในโฟลเดอร์ Program Files ปกติ

แหล่ง

"จะเกิดอะไรขึ้นถ้าฉันหลีกเลี่ยงกลไกการเปลี่ยนเส้นทางและบังคับให้ทุกอย่างติดตั้งใน C: \ Program Files \ จริง"

ไม่มีอะไร ไดเรกทอรีโปรแกรมสองรายการมีไว้สำหรับองค์กรเท่านั้นหรือเพื่อให้โปรแกรมที่มีสองรุ่นแยกรุ่น 32- บิตและ 64- บิตเช่น Internet Explorer แต่คุณสามารถติดตั้งโปรแกรม 32 บิตใน "Program Files" และโปรแกรม 64 บิตใน "Program Files x86" และจะไม่มีอะไรเกิดขึ้นโปรแกรมจะทำงานเหมือนเดิม

Wikiพูดว่า:

ตัวติดตั้งแอปพลิเคชันบางตัวปฏิเสธช่องว่างภายในตำแหน่งพา ธ การติดตั้ง สำหรับระบบ 32 บิตชื่อสั้นสำหรับโฟลเดอร์แฟ้มโปรแกรมเป็นProgra ~ 1 สำหรับระบบ 64 บิตชื่อย่อสำหรับโฟลเดอร์โปรแกรมไฟล์ 64- บิตคือ Progra ~ 1 (เหมือนกับระบบ 32- บิต); ในขณะที่ชื่อสั้น ๆ สำหรับโปรแกรมแฟ้มโฟลเดอร์ 32 บิต (x86) ในขณะนี้คือProgra ~ 2


1
ฮิฮิ. บทความที่ดี ความคิดเห็นต่อบทความนั้นเหมือนกันทุกประการ ที่แย่กว่านั้นบทความนี้มานานกว่าสองปีที่ผ่านมาซึ่งเพิ่งแสดงให้เห็นว่าคำถามนี้ไม่ใช่เรื่องใหม่และหากยังไม่สามารถตอบได้อย่างเป็นทางการฉันคิดว่ามันจะไม่เกิดขึ้น (เว้นแต่มีคนจากทีม Windows ตีระฆัง) โอ้ดีฉันคิดว่าเราควรหยุดกังวลและเรียนรู้ที่จะรักระเบิดใช่มั้ยฉันหมายถึงอยู่กับมัน +1 สำหรับการชี้ให้เห็นบทความและแสดงให้เห็นว่าคำถามนี้มีมานานแล้ว
Synetech

1
@Synetech ขอบคุณ! ใช่ความคิดที่อยู่เบื้องหลังการวางลิงค์ของบทความนั้นเหมือนกับที่คุณได้รับ นี่เป็นคำถามที่เก่ามาก แต่ IDK ทำไมผู้คนถึงไม่สามารถทำได้ อย่างไรก็ตาม MS ควรเขียนกิโลไบต์หรือเอกสารสำหรับปัญหานี้ :)
avirk

ใช่พวกเขาควรโดยเฉพาะอย่างยิ่งเพราะไม่ใช่แค่นักพัฒนาที่ถามแม้แต่ผู้ใช้ปกติก็ยังสงสัย น่าเสียดายที่เอกสารของ Microsoft นั้นไม่ค่อยดีนัก
Synetech

@Synetech yup! เอกสาร MS ดูดเวลาส่วนใหญ่ แต่ใช่ว่าพวกเขาได้เขียนบทความที่ดีบางเกินไปและผมค่อนข้างมั่นใจว่าพวกเขาจะนับ;)
avirk

6

เหตุผลก็คือทำให้การอัพเกรดโปรแกรมเป็น 64 บิตง่ายขึ้นสำหรับนักพัฒนา พวกเขาไม่จำเป็นต้องเขียนโค้ดที่กำหนดเองใด ๆ เพื่อตรวจสอบโปรแกรมในไดเรกทอรีเดียวเมื่อทำการคอมไพล์ในโหมด 32 บิตและในอีกไดเร็กทอรีหนึ่งเมื่อทำการคอมไพล์ในโหมด 64 บิต; พวกเขาเพียงแค่ตรวจสอบC:\Program Filesและเมื่อทำงานภายใต้โหมด 32 บิตสิ่งนี้จะเปลี่ยนเป็นC:\Program Files (x86)Windows 64 บิตโดยอัตโนมัติ รายการรีจิสทรีจะถูกแยกระหว่างโปรแกรม 32- บิตและ 64- บิต

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


แต่ทำไมโปรแกรมใดต้องการให้ทั้งสองเวอร์ชั่นติดตั้งพร้อมกัน? ตัวอย่างหนึ่ง: Photoshop และ IE มีส่วนขยายที่เป็นไฟล์. dll พื้นเมือง คุณไม่สามารถมีรหัส 32- และ 64- บิตผสมในกระบวนการเดียวกันดังนั้นจึงไม่สามารถใช้ addon สำหรับรุ่น 32 บิตกับรุ่น 64 บิตและในทางกลับกัน ดังนั้น Photoshop / IE จึงต้องอนุญาตให้ติดตั้งทั้งสองเวอร์ชันหรือเสี่ยงต่อการแตกหักฐานแอดออนที่มีอยู่เดิม


2
+1 อย่างน้อยคุณตอบคำถามพื้นฐานว่าทำไมผู้ใช้โดยเฉลี่ยจะมีทั้งสองเวอร์ชัน
Synetech

5

โปรแกรมที่ทำงานบน "Program Files (x86)" ใช้ระบบย่อยWOW64 (Windows 32- บิตบน Windows 64- บิตเป็นชุดไดรเวอร์และ API ที่ตั้งใจจะรันแอพพลิเคชั่น x32 บนระบบสถาปัตยกรรม x64):

ระบบย่อย WoW64 ประกอบด้วยเลเยอร์ความเข้ากันได้ที่มีน้ำหนักเบาซึ่งมีอินเทอร์เฟซที่คล้ายคลึงกันใน Windows รุ่น 64 บิตทั้งหมด มันมีจุดมุ่งหมายเพื่อสร้างสภาพแวดล้อมแบบ 32 บิตที่ให้อินเทอร์เฟซที่จำเป็นในการเรียกใช้แอปพลิเคชัน Windows แบบ 32 บิตบนระบบ 64 บิต ในทางเทคนิคแล้ว WoW64 นั้นถูกใช้งานโดยใช้ dynamic-link libraries (DLLs) สามตัว:

  • Wow64.dll อินเทอร์เฟซหลักของเคอร์เนล Windows NT ที่แปลระหว่างการเรียกแบบ 32- บิตและ 64- บิตรวมถึงการชี้และการเรียงซ้อนการโทร
  • Wow64win.dll ซึ่งให้จุดเข้าใช้งานที่เหมาะสมสำหรับแอปพลิเคชัน 32 บิต
  • Wow64cpu.dll ซึ่งดูแลการสลับโปรเซสเซอร์จากโหมด 32 บิตเป็น 64 บิต

ระบบ 64 บิตจำเป็นต้อง "เลียนแบบ" แอปพลิเคชั่น 32 บิตนั่นคือเหตุผลที่ Windows จำเป็นต้อง "แยก" โฟลเดอร์โปรแกรมไฟล์สองโฟลเดอร์


7
แต่ทำไมต้องวางไว้ในโฟลเดอร์อื่น? Windows มีความสามารถอย่างเต็มที่ในการกำหนดสถาปัตยกรรมของปฏิบัติการได้โดยดูที่ส่วนหัว PE ทำไมมันไม่สามารถโหลดสภาพแวดล้อมที่เหมาะสมเมื่อมันโหลดปฏิบัติการ?
Synetech

1
ฉันคิดว่ามันเป็นเพียงทางเลือกจาก Microsoft ที่จะแสดงให้ผู้ใช้เห็นได้อย่างง่ายดายว่าสถาปัตยกรรมใดที่พวกเขาต้องการจากโปรแกรมสองเวอร์ชันเมื่อเปิดโปรแกรม ฉันหมายถึงถ้าไม่มีโฟลเดอร์ทั้งสองนี้และหากผู้ใช้นั้นโปร่งใส (ถ้าสลับโดยอัตโนมัติ) พวกเขาไม่รู้ว่าใช้แอพ 32 หรือ 64 บิตหรือไม่พวกเขาก็ไม่รู้ว่าจะเปิดโปรแกรมใด ถ้าทำงานบน 64 bits ..
Diogo

1
IE เวอร์ชัน 64 บิตมีชื่อเสียงว่าแย่มาก
ซามูเอลเอ็ดวินวอร์ด

1
MS แนะนำให้ใช้ office32 เว้นแต่ว่าคุณกำลังทำงานกับชุดข้อมูลที่ใหญ่พอที่จะ จำกัด หน่วยความจำเกิน ฉันเชื่อว่าจำเป็นที่จะต้องคอมไพล์ไบนารีแอดออนเพื่อทำงานกับ office64; รวมกับการไม่ให้ประโยชน์ใด ๆ ในกรณีการใช้งานปกติอยู่เบื้องหลังการตัดสินใจ
Dan Neely

1
ฉันคิดว่าคุณจะพบว่าโปรแกรม 64 บิตที่ติดตั้งไว้อย่างชัดเจนในโฟลเดอร์ Program Files (x86) จะทำงานได้อย่างสมบูรณ์แบบตามปกติ (และในกรณีส่วนใหญ่ในทางกลับกัน) Windows ไม่ใช้ตำแหน่งโฟลเดอร์เพื่อกำหนดวิธีการปฏิบัติต่อการปฏิบัติการ
แฮร์รี่จอห์นสตัน

5

เป็นที่น่าสนใจว่าคำตอบที่นี่และผ่านทางอินเทอร์เน็ตแตกต่างกันเล็กน้อย การค้นหาคำตอบที่แม่นยำสำหรับคำถามที่สำคัญนี้เป็นความท้าทาย ดูเหมือนจะมีข้อมูลเท็จปรากฏอยู่บ้างบนอินเทอร์เน็ตทำให้เกิดความสับสน

ฉันได้ทำการวิจัยจำนวนมากและได้ข้อสรุปต่อไปนี้ซึ่งฉันเชื่อว่าถูกต้อง:

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

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

เหตุผลเดียวสำหรับการแยกค่าเริ่มต้นออกเป็นสองโฟลเดอร์ ('ไฟล์โปรแกรม' และ 'ไฟล์โปรแกรม (x86)') คือถ้าคุณมีโปรแกรมเดียวกันสองรุ่น (รุ่น 32 บิตและ 64 บิต) จะมี วิธีง่ายๆในการแยกไฟล์ที่ซ้อนทับกัน แม้ในกรณีนี้ตราบใดที่ชื่อไฟล์ทั้งหมดไม่ซ้ำกันพวกเขาสามารถมีอยู่จริงในโฟลเดอร์เดียวกันโดยไม่มีผลใด ๆ

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


3

การแยกโฟลเดอร์ต่าง ๆ ทำให้สามารถเก็บแอพพลิเคชั่น 64 บิตและ thos ที่ต้องใช้WoW64แยกต่างหาก

สิ่งนี้มีประโยชน์ - เนื่องจาก@OliverSalzburgชี้ให้เห็นแล้ว - หากคุณต้องการติดตั้งเว็บเบราเซอร์ทั้ง 64 บิตและ 32 บิต (ตัวอย่าง) เนื่องจากปลั๊กอินและ Add-on บางตัวอาจมีให้สำหรับหนึ่งใน ทั้งสอง.

มีไปยังโฟลเดอร์ที่แยกต่างหากทำให้แยกนี้โดยอัตโนมัติโดยใช้เทคนิคเช่นการเปลี่ยนเส้นทางรีจิสทรี

สมมติว่าการติดตั้งพยายามที่จะตรวจสอบไฟล์โปรแกรมโฟลเดอร์โดยการอ่านรีจิสทรีโดยใช้เช่นRegQueryValueEx

ไม่ว่าในกรณีใดก็พยายามอ่านรีจิสตรีคีย์

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion

C:\Program Filesซึ่งปกติจะชี้ไปที่

อย่างไรก็ตามหากตัวติดตั้งเป็นแอปพลิเคชั่นแบบ 32 บิตการเปลี่ยนเส้นทางรีจิสทรีจะทำให้เกิดคีย์ regitry

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion

C:\Program Files (x86)จะอ่านแทนซึ่งปกติจะชี้ไปที่

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

Windows นำเสนอตัวเองแตกต่างจากโปรแกรมที่เรียกว่า "Program Files (x86)" หรือไม่?

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


ขออภัยฉันผสม "ใบอนุญาต" กับ "การห้าม"
Wernfried Domscheit

3

ฉันไม่อยากเชื่อความสับสนที่นี่ .. ประการแรกฉันเป็นนักพัฒนาเต็มเวลา

MS ทำเช่นนี้เพื่อแก้ปัญหากรณีที่มีการใช้ DLL โดยแอปพลิเคชัน 32 บิตที่เก่ากว่าและแอปพลิเคชัน 64 บิตที่ใหม่กว่า ไม่สามารถเปลี่ยนวิธีที่เก่ากว่าได้ (System32, Program Files, etc. ) เนื่องจากจะทำให้โปรแกรมเก่าที่ไม่สามารถทำการคอมไพล์ใหม่ได้

ดังนั้น MS จึงสร้างโฟลเดอร์เพื่อเก็บโปรแกรมเฉพาะแอสเซมบลีและไลบรารี่ 64- บิตเพื่อให้โปรแกรมใหม่สามารถลิงก์ไปยังไลบรารี่ที่เหมาะสม

ในฐานะที่เป็น. NET DLLs สามารถอยู่ร่วมกับรุ่นอื่น ๆ ในเครื่องเดียวกัน ตัวอย่างเช่นคุณสามารถมี Library.1.0.1, Library.1.0.2, Library 1.1.0 เป็นต้นและนี่เป็นเพียงขนาดบิตเฉพาะ (32 หรือ 64) หากไม่ได้ใช้โฟลเดอร์แยกกันแอสเซมบลีทั้งหมดต้องมีรุ่น 32 และ 64 บิต สิ่งนี้จะทำให้เกิดความสับสนอย่างรุนแรงกับไดเรกทอรีที่มีแอสเซมบลีเดียวกันหลายเวอร์ชันอยู่แล้ว

นี่คือสิ่งที่นักพัฒนาทั้งหมด ในฐานะผู้ใช้ฉันต้องจัดการกับมันเมื่อฉันทำงานกับโปรแกรม 32 บิตใน Windows 7 64 และฉันชอบที่มีความสามารถในการเรียกใช้เวอร์ชัน 32 บิตและแอปพลิเคชันเดียวกันใน 64 บิตได้เช่นกัน เมื่อฉันทำงานกับแอพพลิเคชั่น 32 บิตที่ฉันต้องรวบรวมใน 64 บิตสิ่งที่ฉันทำได้คือบอกให้คอมไพเลอร์ทำเช่นนั้น ชื่อ dll และทุกอย่างอื่นยังคงเหมือนเดิม

เหตุผลที่ไม่มีใน Windows 95/98 นี้คือระบบเหล่านั้นจำลองรันไทม์ 32- บิต มันไม่ใช่ระบบปฏิบัติการ 32 บิตของแท้ มันแกล้งทำการประมวลผลแบบ 32 บิตโดยใช้ชื่อ "thunking"

นี่คือคำจำกัดความที่ดี: http://searchwinit.techtarget.com/definition/thunk


1
อย่างไรProgramFiles(x86)` avoid clutter? There are still both 32- and 64-bit versions of files, so avoiding clutter doesn't make sense. There is no difference between putting them in \ 32 \ blah` หรือ\blah\32; วิธีใดก็แยกกัน หากมีสิ่งใดวิธีปัจจุบันแยกส่วนประกอบของแอพ (และทำซ้ำพวกเขาโดยไม่จำเป็นเนื่องจากแอพไม่กี่แอพใช้CommonFilesสำหรับทรัพยากรและเช่นนั้นนอกจากนี้คุณทำให้ฟังดูเหมือนว่าแอพกำลังทิ้ง DLLs ของพวกเขาไว้ในที่เก็บข้อมูลทั่วไป ที่กำลัง 32 บิตกับ EXEs 32 บิตและมันกำลัง 64 บิตกับมันเป็น 64 บิต EXEs.
Synetech

โอ้และสำหรับ 95/98 ใครพูดอะไรเกี่ยวกับเรื่องนั้น? แม้แต่ XP ก็มีระบบย่อย 16 บิต (NTVDM)
Synetech

ฉันคิดว่าคุณต้องการคำอธิบาย มีแอพเพียงไม่กี่ตัวที่ใช้ CommonFiles? ฉันมีแอปพลิเคชั่น 35 รายการที่มีรายการอยู่ที่นั่น เป็นสถานที่ที่ปลอดภัยกว่าในการจัดเก็บส่วนประกอบที่ใช้ร่วมกันกว่าไดเรกทอรี System32 คำแถลงของคุณว่ามีเพียงไม่กี่แอพที่ใช้สิ่งนี้เป็นปัญหา อ้างถึงคุณ: "พวกเขาไม่ต้องกระโดดผ่านห่วงเหล่านี้เพื่อให้โปรแกรม 32 บิตและ 16 บิตในระบบเดียวกันฉันจำไม่เคยเห็น ProgramFiles (16) หรือบาง [... ] ส่วนที่เกี่ยวกับการทำเช่นนี้เพื่อความสะดวกสบายสำหรับโปรแกรมเมอร์ที่สมเหตุสมผล ใช่ .. โปรแกรมเมอร์ทำ เราเขียนแอปพลิเคชันหลังจากทั้งหมด
Jason Locke

หือ?
Synetech

เพียงแค่อีกครั้งอ่านนี้ .. เขาบอกว่ามันได้ดีขึ้นในการตอบกลับของเขา - superuser.com/a/442253/142951 หากคุณไม่ใช่นักพัฒนาซอฟต์แวร์คุณอาจไม่เห็นวัตถุประสงค์
Jason Locke

0

ไม่จำเป็นเลย ตัวอย่างเช่นบนคอมพิวเตอร์ที่ทำงานของฉันฉันติดตั้งแอปพลิเคชันแต่ละรายการในโฟลเดอร์C:\MyPrograms\เพื่อให้แยกออกจากแอปพลิเคชันที่ติดตั้งโดยแผนกไอทีของเรา

แน่นอนว่านี่เป็นการป้องกันไม่ให้ฉันติดตั้งทั้งสองเวอร์ชัน (32 และ 64 บิต) ของแอปพลิเคชั่นเดียว แต่นี่ไม่มีปัญหาในกรณีของฉัน

เมื่อใดก็ตามที่คุณเปิดโปรแกรมโปรแกรมจะC:\Windows\System32\ntdll.dllมีการเรียกใช้DLL ก่อนเสมอ DLL นี้กำหนดว่าโปรแกรมของคุณเป็นแอปพลิเคชัน 32 หรือ 64 บิต ขึ้นอยู่กับว่าคุณถูกเปลี่ยนเส้นทางไปยังWoW64ที่ซึ่งถูกกล่าวถึงในหลายคำตอบแล้ว

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