Tại sao Windows 64 bit cần một thư mục Tập tin Chương trình (x86) riêng biệt?


178

Tôi biết rằng trên phiên bản Windows 64 bit, thư mục "Tệp chương trình" dành cho các chương trình 64 bit và thư mục "Tệp chương trình (x86)" dành cho các chương trình 32 bit, nhưng tại sao điều này thậm chí còn cần thiết?

Theo "cần thiết", tôi không có nghĩa là "tại sao Microsoft không thể đưa ra bất kỳ quyết định thiết kế nào khác?" bởi vì tất nhiên họ có thể có. Thay vào đó, ý tôi là, "tại sao, với thiết kế hiện tại của Windows 64 bit, các chương trình 32 bit phải có một thư mục cấp cao nhất riêng biệt với các chương trình 64 bit?" Nói cách khác, "điều gì sẽ xảy ra nếu tôi bằng cách nào đó tránh được cơ chế chuyển hướng và buộc mọi thứ phải cài đặt thành thực C:\Program Files\?"

Có rất nhiều câu hỏi về Super User và những nơi khác khẳng định "một là cho các chương trình 32 bit, một là cho các chương trình 64 bit", nhưng không có câu hỏi nào tôi có thể tìm ra lý do. Theo kinh nghiệm của tôi, dường như không vấn đề gì nếu chương trình 32 bit được cài đặt đúng chỗ hay không.

Windows bằng cách nào đó trình bày chính nó khác với một chương trình hết "Tệp chương trình (x86)"? Có một mô tả cho thấy chính xác những gì khác nhau cho một chương trình được cài đặt trong "Tệp chương trình (x86)" thay vì "Tệp chương trình" không? Tôi nghĩ rằng Microsoft không thể giới thiệu một thư mục mới mà không có lý do kỹ thuật hợp pháp.


13
Thay vì trả lời câu hỏi của bạn, tôi sẽ hỏi - bạn sẽ xử lý các tệp chương trình \ các tệp chung như thế nào?
sgmoore

8
Câu trả lời một lớp (và do đó là một nhận xét): vì bạn có thể dễ dàng chạy bất kỳ ứng dụng nào từ bất kỳ thư mục nào mà không biết kiến ​​trúc của nó, nên rõ ràng không có lý do bắt buộc nào cho sự tách biệt này. Đó là một vấn đề thuận tiện để hỗ trợ cài đặt gấp đôi các ứng dụng với cả hai kiến ​​trúc . Trong một số trường hợp, nó tạo ra sự khác biệt vì chúng không nhất thiết phải biên dịch lại đơn giản. Vấn đề chính là các ứng dụng 32 bit không thể tải dll 64 bit, do đó bạn thường không thể cài đặt cả hai phiên bản ở cùng một nơi. Cách khác là có hai thư mục "bin" cho mỗi ứng dụng.
Sklivvz

1
@Synetech Tôi thậm chí đã có các chương trình cài đặt theo (x86) chỉ để có x64 nhị phân .. Đôi khi thật kinh khủng.
sinni800

10
Tôi đã luôn tự hỏi tại sao Microsoft không đưa các chương trình 64 bit vào "Tệp chương trình (x64)" thay vì * di chuyển "thư mục Tệp chương trình" kế thừa "sang Tệp chương trình (x86)
LawrenceC

30
Rắc rối thực sự về sự khác biệt 64/32 bit là / Windows / System32 chứa nội dung 64 bit, trong khi / Windows / SysWOW64 chứa nội dung 32 bit
chọc vào

Câu trả lời:


92

Câu trả lời ngắn: Để đảm bảo các ứng dụng 32 bit kế thừa tiếp tục hoạt động giống như trước đây mà không áp đặt các quy tắc xấu cho các ứng dụng 64 bit sẽ tạo ra một mớ hỗn độn vĩnh viễn.

Nó không phải là cần thiết. Nó chỉ thuận tiện hơn các giải pháp khả thi khác như yêu cầu mọi ứng dụng tạo ra cách riêng để tách DLL 32 bit và tệp thực thi khỏi DLL 64 bit và tệp thực thi.

Lý do chính là để tạo ra các ứng dụng 32 bit thậm chí không biết các hệ thống 64 bit tồn tại "chỉ hoạt động", ngay cả khi DLL 64 bit được cài đặt ở những nơi mà ứng dụng có thể nhìn. Ứng dụng 32 bit sẽ không thể tải DLL 64 bit, do đó cần có phương pháp để đảm bảo rằng ứng dụng 32 bit (có thể có trước các hệ thống 64 bit và do đó không có tệp 64 bit nào thậm chí tồn tại) sẽ không tìm thấy DLL 64 bit, thử tải nó, thất bại và sau đó tạo thông báo lỗi.

Giải pháp đơn giản nhất cho việc này là các thư mục riêng biệt. Thực sự thay thế duy nhất là yêu cầu mọi ứng dụng 64 bit "ẩn" các tệp thực thi của nó ở đâu đó mà ứng dụng 32 bit sẽ không nhìn thấy, chẳng hạn như một bin64thư mục bên trong ứng dụng đó. Nhưng điều đó sẽ áp đặt sự xấu xí vĩnh viễn cho các hệ thống 64 bit chỉ để hỗ trợ các ứng dụng cũ.


52
Họ đã không phải nhảy qua các vòng này để cho phép các chương trình 32 bit và 16 bit trên cùng một hệ thống. Tôi không nhớ là đã từng thấy một ProgramFiles (16)hoặc một vài thứ như vậy. Bên cạnh đó, làm thế nào chính xác một chương trình 32 bit "tìm một DLL 64 bit và thử tải nó"? Những chương trình nào xung quanh việc săn lùng các DLL ngẫu nhiên trong %programfiles%? Nếu nó là một DLL được chia sẻ, thì nó sẽ có trong WinSxS; nếu nó không được chia sẻ, thì tùy thuộc vào lập trình viên để quản lý DLL của riêng họ. Mặc dù vậy, phần về nó được thực hiện như một sự thuận tiện cho các lập trình viên hợp lý.
Synetech

30
IIRC Win3.1 không có thư mục tệp chương trình (hoặc hầu hết các ứng dụng bỏ qua nó); kết quả là sẽ không có bất kỳ ứng dụng win16 kế thừa nào đang tìm kiếm nội dung trong các tệp chương trình để bắt đầu. Thay vào đó, các thư viện chia sẻ của IIRC thường được đặt ở đâu đó trong thư mục windows. Win32 có windows \ system và windows \ system32 là một thành phần của điều đó.
Dan Neely

15
Windows 3.1 không hỗ trợ tên tệp dài, do đó, nó sẽ không thể có thư mục 'tệp chương trình'.
Darth Egregious

14
@JarrodRoberson: Hoàn toàn ngược lại, đó là vì Microsoft đánh giá khả năng tương thích ngược cực kỳ cao.
David Schwartz

24
@Jarrod: Trên thực tế, như mọi nhà phát triển đều biết, Microsoft đánh giá khả năng tương thích ngược quá cao. Theo nghĩa đen, mọi API họ có đều có các phương pháp kế thừa mà họ từ chối loại bỏ và thường là các lỗi nghiêm trọng mà họ từ chối sửa, vì họ sợ phá vỡ các chương trình cũ hơn được viết cho API đó. Điều tương tự cũng đúng với hầu hết các API, nhưng không giống với bất kỳ nơi nào gần với phần còn lại của Microsoft.
BlueRaja - Daniel Pflughoeft

65

Nó cho phép bạn cài đặt cả phiên bản 32 bit và 64 bit của ứng dụng mà không cần ghi đè lên chính nó.


Sau khi xem câu trả lời này và nhận xét chủ đề vào ngày hôm sau, tôi nhận ra một sự giám sát lớn có thể có trong câu trả lời của tôi. Tôi đã giả định một nền tảng lập trình và khi tôi nói về bạn trong các bình luận của tôi, tôi không có nghĩa là người dùng, mà là lập trình viên.

Tôi không làm việc cho Microsoft và tôi không biết lý do thực sự đằng sau các thư mục này là gì, nhưng tôi nghĩ lý do để có các thư mục này quá rõ ràng đến nỗi tôi không có vấn đề gì để tranh cãi.

Vì vậy, hãy phá vỡ nó!

  1. Thư mục thật tuyệt vời!

    Hãy đồng ý về một cái gì đó. Thư mục rất tuyệt! Chúng tôi không cần chúng, chúng tôi có đủ tên tệp có thể để đặt mọi tệp đơn vào thư mục gốc của ổ cứng, vậy tại sao lại có thư mục?

    Vâng, họ giúp chúng tôi đặt hàng công cụ của chúng tôi. Và đặt hàng công cụ là tuyệt vời. Nó giúp chúng ta xử lý mọi thứ dễ dàng hơn. Điều này đặc biệt hữu ích khi làm việc với một máy đòi hỏi cấu trúc.

  2. Tách dữ liệu và logic là tuyệt vời!

    Một mô hình thường được tìm thấy trong lập trình, là tách dữ liệu khỏi logic. Bạn muốn một phần biết cách làm một cái gì đó và bạn muốn một phần khác bạn có thể làm một cái gì đó với .

    Điều này cũng được tìm thấy trong hệ thống tập tin.

    Chúng tôi có các thư mục cho ứng dụng (logic) và thư mục cho các vật có giá trị (dữ liệu) của chúng tôi:

    Logic VCL

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

    Dữ liệu

    • %PROGRAMDATA%
    • %HOMEDRIVE%%HOMEPATH%

    Vì vậy, có vẻ như các thư mục là tuyệt vời và nó có ý nghĩa để đặt các chương trình trong thư mục nhỏ của riêng họ. Nhưng tại sao lại có 2? Tại sao không để trình cài đặt xử lý và đặt mọi thứ vào một Programsthư mục?

  3. Trình cài đặt không phải là phép thuật

    Ngày nay, chúng ta thường sử dụng các chương trình nhỏ để cài đặt các chương trình lớn hơn. Chúng tôi gọi những trình cài đặt chương trình nhỏ này .

    Trình cài đặt không phải là phép thuật. Chúng phải được viết bởi các lập trình viên và là các ứng dụng (có lỗi có thể xảy ra) giống như bất kỳ ứng dụng nào khác hiện có. Vì vậy, hãy nhìn vào tình huống mà một lập trình viên tưởng tượng sẽ phải đối mặt vớikhông có hệ thống hiện tại:

    1 thư mục tập tin chương trình

    Nhà phát triển duy trì 2 trình cài đặt. Một cho phiên bản 32 bit và một cho phiên bản 64 bit của ứng dụng của mình. Trình cài đặt 32 bit sẽ ghi vào C:\Program Files\App\và trình cài đặt 64 bit sẽ ghi vào C:\Program Files\App\sixtyfour\.

    2 thư mục tập tin chương trình

    Nhà phát triển duy trì 1 trình cài đặt. Trình cài đặt sẽ luôn viết thư cho %PROGRAMFILES%và phụ thuộc vào hệ điều hành để mở rộng con đường phù hợp (bạn thực sự không sử dụng biến môi trường cho những trường hợp này, bạn muốn sử dụng SHGetKnownFolderPath với FOLDERID_ProgramFilesđể lấy đường dẫn chính xác).
    Mọi thứ đều tự động tìm và vị trí giống hệt với mọi ứng dụng bạn cài đặt .

  4. Tính nhất quán có ý nghĩa

    Khi bạn học một cái gì đó, điều đó thường ngụ ý rằng một hành vi được quan sát là nhất quán. Nếu không thì thực sự không có gì để quan sát và học hỏi.

    Điều này cũng đúng với hệ thống tập tin nhỏ của chúng tôi. Nó có ý nghĩa để luôn luôn đặt cùng một thứ vào cùng một thư mục. Bằng cách đó, chúng tôi sẽ biết nơi để tìm khi chúng tôi đang tìm kiếm một cái gì đó.

    Hệ thống phân biệt ứng dụng 32/64 phù hợp với mục tiêu này. Các ứng dụng được phân tách thành 2 vị trí để tránh xung đột về tên, hành vi tải nhị phân và bảo mật (ở một mức độ nào đó).

Tôi vẫn không hiểu. Điều này dường như vô dụng

Bạn không bao giờ nên quên một điều. Mọi người vô cùng ngu ngốc. Điều này bao gồm người dùng, siêu người dùng và đặc biệt là lập trình viên.

Đây là lý do tại sao chúng ta cần những thứ như chuyển hướng hệ thống tệp để thậm chí làm cho hệ thống của chúng tôi có thể sử dụng được.

Các lập trình viên sẽ chỉ vào đó và cố gắng tải C:\Windows\system32\awesome.dllvà không quan tâm đến việc họ đang chạy trên hệ thống 32 hay 64 bit. Họ sẽ cố tải DLL 64 bit và đơn giản là gặp sự cố. Một số lập trình viên muốn sử dụng một số Office DLL, không vấn đề gì, họ biết tìm nó ở đâu! C:\Program Files\Microsoft\Office\14.0\wizards.dll... Và một vụ tai nạn khác!

Tất cả các yêu cầu này của ứng dụng 32 bit được chuyển hướng vào các đối tác 32 bit để tránh sự cố ứng dụng.

Chúng tôi cần một số tên thư mục cố định để xây dựng một hệ thống như vậy. Nếu không có cấu trúc thư mục để hỗ trợ chuyển hướng này, thì bạn sẽ làm cho nó hoạt động như thế nào?

Được rồi, bây giờ tôi hiểu rồi. Nhưng tại sao không dùng C:\Program Files\x86\sau đó?

Bây giờ chúng ta đang có triết lý ...

Điều gì sẽ xảy ra nếu tôi bằng cách nào đó tránh được cơ chế chuyển hướng và buộc mọi thứ phải cài đặt thành thực C:\Program Files\?

Rất có thể không có gì (miễn là các ứng dụng khác không phụ thuộc vào một vị trí cố định cho ứng dụng đó).

Cơ chế WOW64 móc vào CreateProcessvà sẽ thực hiện tinh vi hơn (tinh vi hơn so với việc kiểm tra tên thư mục của tệp thực thi) kiểm tra trên hình ảnh thực thi để xác định xem nó là 32 hay 64 bit.

Vâng, nhưng ý tôi là, như, TẤT CẢ các ứng dụng!

  • Điều gì sẽ xảy ra nếu tôi đặt cả động cơ diesel và xăng vào xe của tôi?
  • Điều gì sẽ xảy ra nếu tôi cố gắng sử dụng cả dòng điện xoay chiều và dòng điện trực tiếp trên cùng một dòng?
  • Điều gì sẽ xảy ra nếu tôi giữ cả con mèo và con cá của tôi trong cùng một bể cá?

Một số câu hỏi không yêu cầu câu trả lời. Nó không có ý định được thực hiện, đừng làm điều đó. Không có gì để đạt được ở đây. Số lượng vấn đề thay đổi như vậy có thể gây ra sẽ luôn lớn hơn bất kỳ lợi ích có thể có mà ai đó có thể thấy trong việc này.


3
Đó có phải là lý do ban đầu không? Tôi không thể cài đặt ứng dụng C:\Program Files\App32và phải C:\Program Files\App64không?
Stephen Jennings

4
@StephenJennings: Nhưng điều đó sẽ đòi hỏi bạn phải tự đưa ra quyết định. Cách thức hoạt động hiện nay là quy trình này tự động, vì Windows biết thư mục nào sẽ cung cấp khi ứng dụng gọi SHGetSpecialFolderPathđể xác định vị trí cài đặt.
Der Hochstapler

6
@Synetech: Tại sao phải cài đặt vào %PROGRAMFILES%vị trí đầu tiên? Tại sao không đặt phiên bản 32 bit trên màn hình của người dùng và 64 bit vào Thùng rác? Chỉ vì nó có thể được thực hiện, không có nghĩa đó là một ý tưởng tốt. Xin lỗi, tôi không làm theo lý luận của bạn.
Der Hochstapler

4
@Synetech: Vâng, bạn đã đưa ra một ví dụ hoàn toàn tốt về cách nó có thể được thực hiện. Một ví dụ khác hoàn toàn tốt như thế nào nó có thể được thực hiện là cách nó được thực sự được thực hiện ngay bây giờ. Đơn giản chỉ cần viết một tệp vào% PROGRAMFILES% và chắc chắn rằng nó sẽ nằm trong thư mục phù hợp là một điều. Tự kiểm tra xem thư mục nào là đúng . Nếu bạn thực sự không thấy lợi ích của phương pháp trước đây, thì tôi sẽ không thể thuyết phục bạn. Câu hỏi là tại sao có 2 thư mục. Tôi nghĩ rằng câu trả lời của tôi là hoàn toàn hợp lý trong vấn đề đó.
Der Hochstapler

3
@OliverSalzburg, Không khá. Câu hỏi đặt ra là tại sao hai thư mục được yêu cầu , chứ không phải lý do tại sao có được . Trong thực tế, ông thậm chí còn nhấn mạnh nó: tại sao điều này thậm chí còn cần thiết? Bạn đã không giải thích lý do tại sao nó là cần thiết và các ví dụ tôi đã (và thậm chí dụ châm biếm của riêng bạn) chỉ cho thấy rằng nó không phải được thực hiện theo cách nó được.
Synetech

14

TL; DR:

Tóm lại, không, nó không cần thiết ; họ có thể đã sử dụng một thư mục duy nhất và không, Windows không hiển thị khác với chương trình đang chạy từ vị trí này hay vị trí khác.


Chà, mọi người dường như đang đưa ra ý kiến ​​của họ về vấn đề này, vì vậy tôi sẽ đưa ra 2. Những người khác đã phỏng đoán về lý do tại sao Microsoft chọn tạo các thư mục cấp cao nhất riêng biệt cho các phiên bản chương trình 32 bit và 64 bit, vì vậy tôi sẽ bỏ phần đó (lý do tốt nhất là lời giải thích của David rằng đó là một thuận tiện cho lập trình viên). Tất nhiên ngay cả sau đó, nó không hoàn toàn giải quyết câu hỏi trực tiếp tại sao điều này thậm chí còn cần thiết? , mà câu trả lời có lẽ là: không phải vậy .

Thay vào đó, tôi sẽ giải quyết phần chính của câu hỏi

Windows bằng cách nào đó trình bày chính nó khác với một chương trình hết "Tệp chương trình (x86)"?

Không thực sự, nhưng vị trí của chương trình có thể ảnh hưởng đến hành vi, nhưng không phải theo cách bạn nghĩ.

Khi bạn chạy một chương trình, Windows sẽ thiết lập một môi trường để chạy nó (ý tôi là về bộ nhớ, địa chỉ, v.v., không chỉ các biến môi trường). Môi trường này phụ thuộc vào nội dung của tệp thực thi (chương trình 32 bit và 64 bit khác nhau trong nội bộ). Khi bạn chạy chương trình 32 bit trên hệ thống 64 bit, nó chạy trong hệ thống con 32 bit mô phỏng môi trường 32 bit. Nó được gọi là WoW64 (WoW64 là viết tắt của Windows trên Windows 64 bit ) và tương tự như cách các ứng dụng 16 bit sẽ được chạy trong XP bằng NTVDM .

Khi bạn chạy một chương trình có hoặc không có đặc quyền của quản trị viên, nó sẽ ảnh hưởng đến cách chạy, nhưng vị trí sẽ không ảnh hưởng đến nó (mặc dù có một số ví dụ về sự phụ thuộc vị trí như một số trình điều khiển chẳng hạn).

(Tôi đang sử dụng một máy tính khác, vì vậy tôi không thể dựa vào lịch sử trình duyệt của mình để quay lại các bước của mình, nhưng vào ngày khác khi trả lời câu hỏi SU này, tôi đã kết thúc câu hỏi SO này dẫn đến Google PROCESSOR_ARCHITEW6432 dẫn đến câu hỏi SO nàyblog này của Microsoft đăng .)

Ở đâu đó, tôi đọc một bài đăng StackOverflow về cách biến envirnoment %processor_architecutre% cho các kết quả khác nhau tùy thuộc vào nơi bạn chạy dấu nhắc lệnh (Tôi sẽ cố gắng tìm trích dẫn chính xác).

Câu trả lời hóa ra là do phiên bản 32 bit hoặc 64 bit của dấu nhắc lệnh đã được chạy (tức là từ System32\hoặc SysWoW64\). Nói cách khác, trong khi vị trí dường như ảnh hưởng đến hành vi của chương trình, thì đó chỉ là do có các phiên bản khác nhau của chương trình chứ không phải vì Windows xử lý thư mục theo cách đặc biệt.

Điều này có ý nghĩa bởi vì nội dung của tệp thực thi ra lệnh cho dù đó là 32 bit hay 64 bit, vì vậy bạn có thể đặt cả bản sao 32 bit và 64 bit của cùng một chương trình (ví dụ: foobar32.exefoobar64.exe) vào cùng một thư mục và khi bạn thực hiện chúng, chúng sẽ được tải một cách chính xác (phiên bản 64 bit sẽ được chạy nguyên bản và phiên bản 32 bit sẽ được chạy trong lớp mô phỏng WoW64).

FreePascal cho phép bạn cài đặt cả hai phiên bản DOS và Windows và chúng đi trong cùng một thư mục : %programfiles%\FreePascal. Nó quản lý các kiến trúc khác nhau bằng cách giữ các file thực thi ( .exe, .sys, .dll, .ovr, vv) trong thư mục riêng biệt và chia sẻ các file tài nguyên như hình ảnh, nguồn tập tin, vv) Không có lý do kỹ thuật mà điều này có thể không còn được thực hiện cho 32 và Phiên bản 64 bit của một chương trình. Giống như David đã nói, lập trình viên sẽ dễ dàng hơn nếu chúng được giữ riêng biệt (nghĩa là sử dụng các biến để làm cho nó trông giống như chỉ có một bộ tệp, v.v.)


Trả thù bỏ phiếu! Muahahaha! thở dài
Synetech

Bỏ phiếu lạ: \. BTW giải thích tốt +1.
avirk

11

Một lý do khác là hầu hết các chương trình được sử dụng để sử dụng các biến môi trường như% PROGRAMFILES% để chỉ ra nơi chương trình của chúng được cài đặt. Đối với các chương trình 64 bit, nó đi đến nơi bình thường. Đối với các chương trình 32 bit, nó sẽ chuyển hướng đến Program Files (x86)thư mục mới .

Mặc dù, ít nhất là với công cụ .Net mới trong Visual Studio, giờ đây họ có biến App.Local giúp loại bỏ toàn bộ nhu cầu này.


4
Điều đó không giải thích nó. Chính xác là ai đang sử dụng biến môi trường và tại sao nó quan tâm liệu chương trình là 32 bit hay 64 bit?
Synetech

4
@Synetech - Tác giả của các chương trình sử dụng biến môi trường. Vì lý do nó sẽ quan tâm là vì các tài liệu tham khảo cho dlls. Bạn không thể tải dll 32 bit trong quy trình 64 bit và ngược lại.
Ramhound

1
Và làm thế nào để %programfiles%, %programfiles(x86)%hoặc %programw6432%tạo sự khác biệt đó? Bất kỳ DLL được chia sẻ nào đều đi vào thư mục WinSxS duy nhất và mọi DLL không chia sẻ đều ở ngay đó với tệp thực thi. Điều này sẽ chỉ quan trọng nếu vì một lý do nào đó bạn đã cài đặt cả hai phiên bản 32 bit và 64 bit của cùng một chương trình, và thậm chí sau đó, bạn sẽ giữ các DLL 32 bit với tệp thực thi 32 bit và DLL 64 bit với thực thi 64 bit. Bạn có thể làm như vậy: %programfiles%\CoolApp\bin\32và% chương trình% \ CoolApp \ bin \ 64`, tại sao các thư mục cấp cao nhất riêng biệt?
Synetech

@Synetech Chắc chắn là có; % chương trình% đã được một khoảng thời gian. Nếu bạn cài đặt chương trình 32 bit trên máy tính 64 bit, việc có một nơi sẽ gây ra sự cố cho ứng dụng 32 bit đó. WoW mặc dù có thể chuyển hướng% chương trình% sang phiên bản (x86) cho các ứng dụng 32 bit và phiên bản không phải x86 cho 64.
Andy

Tôi nghĩ mọi người sẽ không bối rối, nếu không có sự chuyển hướng ngầm
kommradHomer

8

Giải pháp của Microsoft cho quá trình chuyển đổi này từ 32 bit sang 64 bit là thêm hỗ trợ kế thừa cho hầu hết các ứng dụng 32 bit. Nói cách khác, hầu hết các ứng dụng 32 bit sẽ hoạt động trong môi trường hoạt động 64 bit. Hãy nhớ rằng các hệ điều hành khác hoạt động trên kiến ​​trúc 64 bit không thể tải hoặc chạy các ứng dụng 32 bit.

Để giúp việc chuyển đổi dễ dàng hơn, Microsoft đã chỉ định rằng tất cả ứng dụng 32 bit, theo mặc định, phải được tải vào thư mục Tệp chương trình (x86) thay vì trộn lẫn với các ứng dụng 64 bit thực sự trong thư mục Tệp chương trình thông thường.

Nguồn

"điều gì sẽ xảy ra nếu tôi bằng cách nào đó tránh được cơ chế chuyển hướng và buộc mọi thứ phải cài đặt vào C: \ Program Files \?"

Không có gì. Hai thư mục chương trình chỉ dành cho tổ chức hoặc để giữ các chương trình có hai phiên bản một phiên bản 32 bit và 64 bit, như Internet Explorer. Nhưng bạn có thể cài đặt chương trình 32 bit trong "Tệp chương trình" và chương trình 64 bit trong "Tệp chương trình x86" và không có gì xảy ra chương trình sẽ chạy tương tự.

Wiki nói:

Một số trình cài đặt ứng dụng từ chối khoảng trắng trong vị trí đường dẫn cài đặt. Đối với hệ thống 32 bit, tên viết tắt của thư mục Tệp chương trình là Progra ~ 1 . Đối với hệ thống 64 bit, tên viết tắt của thư mục Tệp chương trình 64 bit là Progra ~ 1 (giống như trên hệ thống 32 bit); trong khi tên viết tắt của thư mục Tệp chương trình 32 bit (x86) hiện là Progra ~ 2 .


1
Hehe. Bài viết hay. Các ý kiến ​​cho bài viết đó nghe giống hệt như những người ở đây. Tồi tệ hơn, bài báo đó là từ hơn hai năm trước, điều này chỉ ra rằng câu hỏi này không phải là mới và nếu nó vẫn không thể được trả lời một cách có thẩm quyền, thì tôi đoán nó sẽ không bao giờ (trừ khi có ai đó trong nhóm Windows bấm chuông). Ồ, tôi cho rằng tất cả chúng ta nên ngừng lo lắng và học cách yêu bom, uh, ý tôi là sống với nó. +1 Để chỉ ra bài viết và cho thấy rằng câu hỏi này đã tồn tại quá lâu.
Synetech

1
@Synetech cảm ơn! Vâng, ý tưởng đằng sau việc đặt liên kết bài viết cũng giống như bạn có. Đây là một câu hỏi thời gian rất cũ nhưng IDK tại sao mọi người không thể nhận được nó. Tuy nhiên, MS nên viết KB hoặc Tài liệu cho vấn đề này :)
avirk

Có, họ nên, đặc biệt bởi vì không chỉ các nhà phát triển yêu cầu, ngay cả người dùng bình thường cũng tự hỏi về nó. Thật không may, tài liệu của Microsoft thường không quá tốt.
Synetech

@Synetech yup! Tài liệu MS hút hầu hết thời gian. Nhưng vâng, họ cũng đã viết một số bài viết hay và tôi khá chắc chắn rằng chúng có thể đếm được;)
avirk

6

Lý do là để nâng cấp chương trình lên 64 bit dễ dàng hơn cho các nhà phát triển. Họ không phải viết bất kỳ mã tùy chỉnh nào để kiểm tra chương trình trong một thư mục khi biên dịch ở chế độ 32 bit và trong thư mục khác khi biên dịch ở chế độ 64 bit; họ chỉ kiểm tra C:\Program Filesvà khi chạy ở chế độ 32 bit, điều này sẽ tự động được thay đổi thành C:\Program Files (x86)Windows 64 bit. Tương tự, các mục đăng ký được cách ly giữa các chương trình 32 bit và 64 bit.

Điều này ngăn chặn xung đột từ các nhà phát triển không biết thay đổi chế độ biên dịch thành 64 bit mà không cần suy nghĩ nhiều và ngăn chặn một lượng lớn công việc cho các nhà phát triển muốn người dùng có thể cài đặt cả phiên bản 32 và 64 bit của họ phần mềm đồng thời.


Nhưng tại sao bất kỳ chương trình nào cũng muốn cho phép cả hai phiên bản được cài đặt đồng thời? Một ví dụ: Photoshop và IE có các phần mở rộng là bản gốc. Bạn không thể trộn mã 32 và 64 bit trong cùng một quy trình, do đó, một addon cho phiên bản 32 bit không thể được sử dụng với phiên bản 64 bit và ngược lại. Do đó, Photoshop / IE phải cho phép cả hai phiên bản được cài đặt hoặc có nguy cơ phá vỡ cơ sở khổng lồ của các addon hiện có.


2
+1 Ít nhất bạn đã giải quyết câu hỏi cơ bản về lý do tại sao người dùng trung bình sẽ có cả hai phiên bản.
Synetech

5

Các chương trình chạy trên "Tệp chương trình (x86)" sử dụng hệ thống con WOW64 (Windows 32-bit trên Windows 64-bit là một bộ trình điều khiển và API có ý định chạy các ứng dụng x32 trên hệ thống kiến ​​trúc x64):

Hệ thống con WoW64 bao gồm một lớp tương thích nhẹ có giao diện tương tự trên tất cả các phiên bản Windows 64 bit. Nó nhằm mục đích tạo ra một môi trường 32 bit cung cấp các giao diện cần thiết để chạy các ứng dụng Windows 32 bit chưa sửa đổi trên hệ thống 64 bit. Về mặt kỹ thuật, WoW64 được triển khai bằng ba thư viện liên kết động (DLL):

  • Wow64.dll, giao diện cốt lõi cho nhân Windows NT dịch giữa các cuộc gọi 32 bit và 64 bit, bao gồm các thao tác ngăn xếp con trỏ và cuộc gọi
  • Wow64win.dll, cung cấp các điểm nhập thích hợp cho các ứng dụng 32 bit
  • Wow64cpu.dll, đảm nhiệm việc chuyển đổi bộ xử lý từ chế độ 32 bit sang 64 bit

Hệ thống 64 bit cần "mô phỏng" các ứng dụng 32 bit, đó là lý do tại sao Windows cần "tách riêng" hai thư mục Tệp chương trình.


7
Nhưng tại sao nó phải đặt nó trong các thư mục khác nhau? Windows đã hoàn toàn có khả năng xác định kiến ​​trúc của một tệp thực thi bằng cách nhìn vào tiêu đề PE. Tại sao nó không thể tải môi trường thích hợp khi nó tải thực thi?
Synetech

1
Tôi nghĩ rằng đó chỉ là một lựa chọn từ Microsoft để dễ dàng hiển thị cho người dùng kiến ​​trúc họ muốn từ hai phiên bản chương trình khi mở một chương trình. Ý tôi là, nếu không có hai thư mục này và nếu nó trong suốt đối với người dùng (nếu nó tự động chuyển đổi), họ sẽ không biết nếu chạy ứng dụng 32 hoặc 64 bit, thậm chí, họ sẽ không biết nên mở chương trình nào nếu chạy trên 64 bit ..
Diogo

1
Phiên bản 64 bit của IE có tiếng là khủng khiếp.
Phường Samuel Edwin

1
MS khuyên bạn nên sử dụng office32 trừ khi bạn làm việc với bộ dữ liệu đủ lớn để vượt quá giới hạn bộ nhớ. Tôi tin rằng cần phải biên dịch lại các addon nhị phân để làm việc với office64; kết hợp với việc không đưa ra bất kỳ lợi ích nào trong các trường hợp sử dụng thông thường là đằng sau quyết định.
Dan Neely

1
Tôi nghĩ bạn sẽ thấy rằng một chương trình 64 bit được cài đặt rõ ràng vào thư mục Tệp chương trình (x86) sẽ hoạt động hoàn toàn bình thường (và, trong hầu hết các trường hợp, ngược lại). Windows không sử dụng vị trí thư mục để xác định cách xử lý tệp thực thi.
Harry Johnston

5

Thật thú vị khi các câu trả lời ở đây và trên internet thay đổi khá nhiều. Tìm một câu trả lời chính xác cho câu hỏi quan trọng này là một thách thức. Dường như có khá nhiều thông tin sai lệch được trình bày trên internet, dẫn đến sự nhầm lẫn.

Tôi đã thực hiện một lượng nghiên cứu đáng kể và đã rút ra kết luận sau đây, điều mà tôi tin là chính xác:

  • Nó không có sự khác biệt nơi một ứng dụng được lưu trữ. Khi chạy, Windows sẽ xác định xem ứng dụng là 32 bit hay 64 bit và tự động sử dụng phần đăng ký và DLL thích hợp.

Điều này xảy ra tự động và độc lập với nơi ứng dụng được lưu trữ. Không có tốc độ, độ tin cậy hoặc lợi ích chức năng khác để có các thư mục 32 bit và 64 bit riêng biệt.

Lý do duy nhất để phân tách mặc định thành hai thư mục ('Tệp chương trình' và 'Tệp chương trình (x86)') là nếu bạn có hai phiên bản của cùng một chương trình (phiên bản 32 bit và 64 bit), nó cung cấp một cách đơn giản để giữ các tập tin chồng chéo riêng biệt. Ngay cả trong trường hợp này, miễn là tất cả các tên tệp là duy nhất, chúng thực sự có thể tồn tại trong cùng một thư mục mà không có bất kỳ hậu quả nào.

Có một sự cảnh báo cho kết luận trên, và đó là một trong những ứng dụng được mã hóa kém. Nếu một ứng dụng có bất kỳ đường dẫn nào được mã hóa vào nó, nó sẽ chỉ sử dụng đường dẫn đó. Theo quy định, các đường dẫn không bao giờ được mã hóa cứng vào một ứng dụng, nhưng đôi khi một lập trình viên sẽ mắc lỗi này. Trong trường hợp này, chương trình sẽ sử dụng đường dẫn được mã hóa cứng; thư mục cài đặt ứng dụng sẽ không ảnh hưởng đến nơi thực sự tìm tệp.


3

Việc phải tách các thư mục giúp có thể giữ các ứng dụng và bit 64 bit gốc yêu cầu WoW64 cách nhau.

Điều này có thể hữu ích - như @OliverSalzburg đã chỉ ra - nếu bạn muốn cài đặt cả trình duyệt web 64 bit và 32 bit (ví dụ), vì một số plugin và tiện ích bổ sung có thể chỉ có sẵn cho một trong số cả hai.

Phải tách các thư mục làm cho việc phân tách này tự động , sử dụng các kỹ thuật như chuyển hướng đăng ký .

Giả sử một trình cài đặt cố gắng xác định thư mục tệp chương trình bằng cách đọc sổ đăng ký bằng cách sử dụng, ví dụ: RegQueryValueEx .

Trong mọi trường hợp, nó cố gắng đọc khoá đăng ký

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion

mà thường chỉ đến C:\Program Files.

Tuy nhiên, nếu trình cài đặt là ứng dụng 32 bit, chuyển hướng đăng ký sẽ gây ra khóa regitry

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion

để được đọc thay thế, mà thường chỉ đến C:\Program Files (x86).

Tại sao những tên thư mục cụ thể này đã được sử dụng chỉ có thể được trả lời bởi những người đưa ra lựa chọn này. Bạn luôn có thể thay đổi tên của các thư mục mặc định nếu bạn muốn.

Windows bằng cách nào đó trình bày chính nó khác với một chương trình hết "Tệp chương trình (x86)"?

Tôi nghi ngờ điều đó. Hầu hết các trình cài đặt cho phép bạn chọn thư mục cài đặt tùy chỉnh, vì vậy nó không thực sự quan trọng một chương trình được cài đặt.


Xin lỗi tôi đã trộn "giấy phép" với "cấm"
Wernfried Domscheit

3

Tôi không thể tin được sự nhầm lẫn ở đây .. trước hết tôi là một nhà phát triển toàn thời gian.

MS đã làm điều này để giải quyết trường hợp DLL được sử dụng bởi cả các ứng dụng 32 bit cũ hơn và các ứng dụng 64 bit mới hơn. Không thể thay đổi phương thức cũ hơn (System32, Tệp chương trình, v.v.) vì điều đó sẽ phá vỡ các chương trình cũ không thể biên dịch lại được.

Vì vậy, MS đã tạo một thư mục để lưu trữ các chương trình, tập hợp và thư viện cụ thể 64 bit để các chương trình mới có thể liên kết với các thư viện thích hợp và các chương trình cũ sẽ tiếp tục hoạt động như bình thường.

Như hiện tại, DLL .Net có thể cùng tồn tại với các phiên bản khác trên cùng một máy. Ví dụ: bạn có thể có Library.1.0.1, Library.1.0.2, Library 1.1.0, v.v. Và điều này chỉ dành cho một kích thước bit cụ thể (32 hoặc 64). Nếu các thư mục riêng biệt không được sử dụng, thì mọi lắp ráp cần phải có phiên bản 32 và 64 bit. Điều này sẽ làm lộn xộn một thư mục chứa nhiều phiên bản của cùng một hội đồng.

Đây là tất cả các công cụ phát triển. Là người dùng, tôi chỉ phải xử lý khi tôi làm việc với chương trình 32 bit trên Windows 7 64. Và tôi thích có khả năng chạy phiên bản 32 bit và cùng một ứng dụng trong 64 bit. Khi tôi đang làm việc trên một ứng dụng 32 bit mà tôi cần biên dịch thành 64 bit, tất cả những gì tôi làm là bảo trình biên dịch làm như vậy. Tên dll và mọi thứ khác vẫn giữ nguyên.

Lý do điều này không tồn tại với Windows 95/98 là những hệ thống đó được mô phỏng thời gian chạy 32 bit; Nó không phải là một hệ điều hành 32 bit chính hãng. Nó giả mạo thực thi 32-bit với một cái gì đó có tên là "thunking".

Đây là một định nghĩa tốt: http://searchwinit.techtarget.com/def định / thunk


1
Làm thế nào 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` hoặc \blah\32; một trong hai cách, chúng được tách ra Nếu có bất cứ điều gì, cách hiện tại tách biệt các thành phần của ứng dụng (và cũng sao chép chúng một cách không cần thiết vì ít ứng dụng sử dụng CommonFilescho tài nguyên và như vậy. Bên cạnh đó, bạn phát ra âm thanh như thể các ứng dụng đang bỏ các DLL của chúng vào một thùng chung. DLL 32 bit với exes 32 bit và DLL 64 bit với exes 64 bit.
Synetech

Ồ, và đối với 95/98, ai nói gì về điều đó? Ngay cả XP cũng có hệ thống con 16 bit (NTVDM).
Synetech

Tôi nghĩ bạn muốn một lời giải thích. Rất ít ứng dụng sử dụng CommonFiles? Tôi có 35 ứng dụng khác nhau có mục ở đó. Đây là nơi an toàn hơn để lưu trữ các thành phần được chia sẻ so với thư mục System32. Tuyên bố của bạn rằng ít ứng dụng sử dụng điều này là gây tranh cãi. Trích dẫn bạn: "Họ không phải nhảy qua các vòng này để cho phép các chương trình 32 bit và 16 bit trên cùng một hệ thống. Tôi không nhớ là đã từng thấy một ProgramFiles (16) hay một số [...] Mặc dù vậy, phần về nó được thực hiện như một sự thuận tiện cho các lập trình viên. " Vâng, vâng .. lập trình viên làm. Chúng tôi viết các ứng dụng sau khi tất cả.
Jason Locke

Huh?
Synetech

Chỉ cần đọc lại điều này .. anh ấy đã nói nó tốt hơn trong các câu trả lời của mình - superuser.com/a/442253/142951 . Nếu bạn không phải là nhà phát triển, bạn có thể không thấy mục đích.
Jason Locke

0

Nó không cần thiết chút nào. Ví dụ: trên máy tính làm việc của tôi, tôi cài đặt từng ứng dụng trong thư mục C:\MyPrograms\để tách chúng khỏi các ứng dụng được cài đặt bởi bộ phận CNTT của chúng tôi.

Tất nhiên, điều này ngăn tôi cài đặt cả hai phiên bản (32 và 64 bit) của một ứng dụng, nhưng điều này không có vấn đề gì trong trường hợp của tôi.

Bất cứ khi nào bạn khởi chạy một chương trình, thì luôn luôn DLL đầu tiên C:\Windows\System32\ntdll.dllđược thực thi. DLL này xác định xem chương trình của bạn là ứng dụng 32 hay 64 bit. Tùy thuộc vào đó bạn được chuyển hướng đến WoW64được đề cập trong một số câu trả lời.

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.