Tại sao DLL 64 bit chuyển đến System32 và DLL 32 bit sang SysWoW64 trên Windows 64 bit?


227

Tôi muốn biết khi nào chúng ta cần đặt một tập tin dưới

C: \ Windows \ System32 hoặc C: \ Windows \ SysWOW64, trên hệ thống cửa sổ 64 bit.

Tôi đã có hai DLL, một cho 32 bit, một cho 64 bit.

Về mặt logic, tôi nghĩ rằng tôi đã đặt DLL 32 bit trong C: \ Windows \ System32 và DLL 64 bit trong C: \ Windows \ SysWOW64.

Thật ngạc nhiên, đó là cách khác ! Một 32 bit đi vào C: \ Windows \ SysWOW 64 và DLL 64 bit đi vào C: \ Windows \ System 32 .

Những thứ rất khó hiểu. Lý do đằng sau điều này là gì?


2
Ngoài ra, điều này: Windows tìm trong thư mục làm việc hiện tại cũng như trong hệ thống PATH. Không có cách nào để xác định khác. Oh chờ đã, có. Bạn có thể nhúng đường dẫn tìm kiếm trong DLL của bạn. Nó là một trường dài 8 byte. Đúng. 8 ký tự.
Jeroen Baert

Điều này dường như không đúng trên Windows 7. Chạy tệp trên DLL trong tệp system32 C: \ Windows \ system32 \ user32.dll C: \ Windows \ system32 \ user32.dll; PE32 thực thi cho MS Windows (DLL) (GUI) Intel 80386 32 bit Nhưng đối với DLL 64 bit, nó in PE32 + có thể thực thi được cho MS Windows (DLL) (bảng điều khiển) Lắp ráp Mono / .Net Lưu ý rằng DLL này không phải là .Net hội,, tổ hợp. Nó là một DLL bản địa.
dùng877329


11
Cuộc phỏng vấn với một cựu Microsoftie . (Để được giải thích nghiêm túc về việc điều này xảy ra như thế nào, hãy xem câu trả lời này .)
Tgr

superuser.com/a/157301/241386 "Lý do tương thích ngược. Toàn bộ nhiều ứng dụng giả định những thứ chúng không nên sử dụng và đường dẫn mã cứng"
phuclv 21/07/2015

Câu trả lời:


225

Tôi tin rằng mục đích là đổi tên System32, nhưng rất nhiều ứng dụng được mã hóa cứng cho đường dẫn đó, rằng việc loại bỏ nó là không khả thi.

SysWoW64 không dành cho các hệ thống 64 bit, nó thực sự giống như "Windows trên Windows64", nghĩa là các bit bạn cần để chạy các ứng dụng 32 bit trên cửa sổ 64 bit.

Bài viết này giải thích một chút:

"Windows x64 có một thư mục System32 chứa DLL 64 bit (sic!). Do đó, các quá trình nguyên gốc với một chút 64 tìm thấy các DLL DLL của họ, nơi họ mong đợi chúng: trong thư mục System32. Thư mục thứ hai, SysWOW64, chứa 32 -bit DLL. Bộ chuyển hướng hệ thống tệp thực hiện phép thuật ẩn thư mục System32 thực cho các quy trình 32 bit và hiển thị SysWOW64 dưới tên System32. "

Chỉnh sửa: Nếu bạn đang nói về trình cài đặt, bạn thực sự không nên mã hóa đường dẫn đến thư mục hệ thống. Thay vào đó, hãy để Windows chăm sóc nó cho bạn dựa trên việc trình cài đặt của bạn có chạy trên lớp mô phỏng hay không.


27
Ugh, tôi vừa gặp phải sự kỳ lạ này ngày hôm nay. Thật là một điều sai lầm mà họ đã làm.
Andy White

16
Hôm nay tôi cũng gặp rắc rối ... thật khó hiểu - Glut 32 bit dll đi vào / SysWOW64, Glut 64 bit dll đi vào / System32. Ai đó nên viết nó xuống. Trên mạng.
Jeroen Baert

8
Tin tốt là, như một ví dụ về thiên tài kỹ thuật của Microsoft, đây là tài liệu tự viết khá nhiều.
Spike0xff

8
Một điều tôi không nhận được là, nếu hệ thống tệp có thể nói rằng đó là ứng dụng 32 bit và chuyển hướng nó đến SysWOW64thư mục, tại sao họ không thể phát hiện ra ứng dụng 64 bit và chuyển hướng đến a System64?!
Cole Johnson

6
System32 là phiên bản Windows 32 bit của System DLLs. Hệ thống là phiên bản 16 bit. Cùng một công ty đã cung cấp cho chúng tôi Windows 8 đã cho chúng tôi SysWow64 cho DLL 32 bit và System32 cho DLL 64 bit khi chạy trên HĐH 64 bit. Trong các hệ thống 64 bit, thư mục Hệ thống vẫn là rác 16 bit cũ, chỉ có System32 không phải là 32 bit như đề xuất và công cụ 32 bit nằm trong thư mục Hệ thống có 64 tên. Tôi không thấy làm thế nào điều này giúp bất cứ ai. nó làm phức tạp mọi thứ và phá vỡ mọi thứ Tất cả để cứu mọi người khỏi việc thích ứng "System32" được mã hóa cứng thành "System64" khi chuyển đổi thành 64 bit. Idiocy
Armand

26

Tôi nên thêm: Bạn không nên đưa dll của bạn vào \ system32 \! Sửa đổi mã của bạn, sửa đổi trình cài đặt của bạn ... tìm một ngôi nhà cho các bit của bạn KHÔNG ở đâu trong c: \ windows \

Ví dụ: trình cài đặt của bạn đặt dlls của bạn vào:

\program files\<your app dir>\

or

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

( Lưu ý : Cách bạn thực sự làm điều này là sử dụng môi trường var:% ProgramFiles% hoặc% ProgramFiles (x86)% để tìm vị trí Tệp chương trình .... bạn không cho rằng đó là c: \ tệp chương trình \ .. ..)

và sau đó đặt thẻ đăng ký:

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

Mã sử ​​dụng các dll của bạn đọc registry, sau đó tự động liên kết với các dll ở vị trí đó.

Trên đây là cách thông minh để đi.

Bạn chưa bao giờ cài đặt dll của mình hoặc dll của bên thứ ba vào \ system32 \ hoặc \ syswow64. Nếu bạn phải tải tĩnh, bạn đặt dlls của bạn vào thư mục exe của bạn (nơi chúng sẽ được tìm thấy). Nếu bạn không thể dự đoán thư mục exe (ví dụ: một số exe khác sẽ gọi dll của bạn), bạn có thể phải đưa thư mục dll của mình vào đường dẫn tìm kiếm (tránh điều này nếu có thể!)

system32 và syswow64 dành cho các tệp do Windows cung cấp ... không dành cho bất kỳ ai sử dụng các tệp . Lý do duy nhất khiến mọi người có thói quen xấu là đặt công cụ đó là vì nó luôn nằm trong đường dẫn tìm kiếm và nhiều ứng dụng / mô-đun sử dụng liên kết tĩnh. (Vì vậy, nếu bạn thực sự hiểu về nó, tội lỗi thực sự là liên kết tĩnh - đây là một tội lỗi trong mã gốc và mã được quản lý - luôn luôn luôn liên kết động!)


9
+1 ... nhưng tôi muốn thêm rằng bạn nên sử dụng các biến như% PROGRAMFILES% not \ Program Files \
Rod MacPherson

Trong thời của XP, việc các nhà phát triển sử dụng sổ đăng ký cho những việc đó là một cách phổ biến (và được đề xuất). Với Windows 7, điều này không còn đúng nữa! Vì lý do của UAC, nhiều phiên người dùng, v.v. Sổ đăng ký trong Windows 7 nên được sử dụng một cách tiết kiệm và theo quyết định của các nhà phát triển.
ryyker

@RodMacPherson Phản hồi của tôi đã được nâng cao để đưa đề xuất của bạn vào tài khoản. Bạn đã đúng!
Jonesome phục hồi Monica

Sau khi xem xét, tôi nghĩ rằng câu trả lời này tốt hơn cho câu hỏi - "Khi nào chúng ta cần đặt một tệp dưới% HỆ THỐNG%". Không bao giờ. Câu trả lời này không thỏa mãn sự tò mò về thư mục syswow64, nhưng đó là một trong những nhà phát triển thực sự cần đọc.
Thomas

7

Chạy vào cùng một vấn đề và nghiên cứu điều này trong vài phút.

Tôi được dạy sử dụng Windows 3.1 và DOS, nhớ những ngày đó không? Không lâu sau khi tôi làm việc với máy tính Macintosh một thời gian, rồi bắt đầu quay trở lại Windows sau khi mua máy x64-bit.

Có những lý do thực sự đằng sau những thay đổi này (một số người cho rằng có ý nghĩa lịch sử), cần thiết cho các lập trình viên tiếp tục công việc của họ.

Hầu hết các thay đổi được đề cập ở trên:

  • Program Files đấu với Program Files (x86)

    Ban đầu, các tệp 16 / 86bit đã được ghi vào, bộ xử lý Intel '86'.

  • System32thực sự có nghĩa là System64(trên Windows 64 bit)

    Khi các nhà phát triển lần đầu tiên bắt đầu làm việc với Windows7, đã có một số vấn đề tương thích trong đó các ứng dụng khác được lưu trữ.

  • SysWOW64 Thực sự có nghĩa là SysWOW32

    Về cơ bản, trong tiếng Anh đơn giản, nó có nghĩa là 'Windows trên Windows trong một máy 64 bit' . Mỗi thư mục đang chỉ ra vị trí của DLL cho các ứng dụng mà họ muốn sử dụng chúng.

Đây là hai liên kết với tất cả các thông tin cơ bản bạn cần:

Hy vọng điều này sẽ làm rõ ràng mọi thứ!


4
Nếu bạn muốn được thực hiện nghiêm túc, có lẽ bạn nên giảm tiếng lóng và cải thiện ngữ pháp. Ngoài ra, bạn có thể muốn cấu trúc câu trả lời của mình nhiều hơn một chút, sử dụng các đoạn văn.
Klas Mellbourn

2
@Crispy dọn dẹp câu trả lời. Trong tương lai, bạn nên xem xét những gì Klas gợi ý và định dạng phản hồi của bạn để tăng cơ hội nâng cao. :)
Nhắc lạiPhoenix

OP cần phải được viết lại hoàn toàn, hoặc thậm chí loại bỏ. Nó là sai lệch và không thực sự hữu ích.
Jonesome phục hồi

5
SysWOW64 thực sự là viết tắt của: [Sys] tem [W] indows 32-bit [o] n [W] indows [64] -bit do đó dạng viết tắt SysWoW64 (thực sự không có ý nghĩa gì, và Microsoft chỉ để System32 cho công cụ 32 bit và tạo System64, thực sự sẽ không có vấn đề tương thích. Những gì Microsoft làm trong hộp cát WoW là tạo chuyển hướng trong bộ nhớ từ truy cập 32 bit vào System32 như một yêu cầu đối với SysWoW64 ... làm thế nào điều này không phức tạp hơn chỉ là phơi bày hệ thống tệp trong w / o thô phải sắp xếp lại một cách kỳ diệu cho các nền tảng khác nhau? Như đã lưu ý trong một nhận xét trước - Idiocy.
Armand

1
Câu trả lời mang lại nhiều hiểu lầm hơn là sự rõ ràng trong câu hỏi, bình luận của Armands là lời giải thích tốt.
nahab

5

System32 là nơi Windows trong lịch sử đã đặt tất cả các DLL 32 bit và System là dành cho các DLL 16 bit. Khi microsoft tạo ra HĐH 64 bit, mọi người mà tôi biết đều mong đợi các tệp nằm trong System64, nhưng Microsoft đã quyết định đặt các tệp 64 bit trong System32 có ý nghĩa hơn. Lý do duy nhất tôi có thể tìm thấy là họ muốn mọi thứ 32bit hoạt động trong Windows 64 bit mà không phải thay đổi bất cứ điều gì trong các chương trình - chỉ cần biên dịch lại và đã xong. Cách họ giải quyết điều này, để các ứng dụng 32 bit vẫn có thể chạy, là tạo ra một hệ thống con windows 32 bit có tên Windows32 Trên Windows64. Như vậy, từ viết tắt SysWOW64 đã được tạo cho thư mục Hệ thống của hệ thống con 32 bit. Sys là viết tắt của System và WOW64 là viết tắt của Windows32OnWindows64.
Vì windows 16 đã được tách riêng khỏi Windows 32, nên không cần Windows 16 trên Windows 64 tương đương. Trong hệ thống con 32 bit, khi một chương trình sử dụng các tệp từ thư mục system32, họ thực sự nhận được các tệp từ thư mục SysWOW64. Nhưng quá trình này là thiếu sót.

Đó là một thiết kế khủng khiếp. Và theo kinh nghiệm của tôi, tôi đã phải thực hiện nhiều thay đổi hơn nữa khi viết các ứng dụng 64 bit, chỉ cần thay đổi thư mục System32 để đọc System64 sẽ là một thay đổi rất nhỏ và một trong những chỉ thị của trình biên dịch trước sẽ xử lý.


2

Những người khác đã hoàn thành tốt công việc giải thích câu hỏi hóc búa này ... và tôi nghĩ Chris Hoffman đã làm một công việc thậm chí còn tốt hơn ở đây: https://www.howtogeek.com/326509/whats-the-difference-b system32-and-syswow64-thư mục trong cửa sổ /

Hai suy nghĩ của tôi:

  1. Tất cả chúng ta đều mắc phải những sai lầm thiển cận ngu ngốc trong cuộc sống. Khi Microsoft đặt tên thư mục Win32 DLL của họ (vào thời điểm đó là "System32", điều đó có ý nghĩa vào thời điểm đó ... họ chỉ không xem xét điều gì sẽ xảy ra nếu / khi phiên bản 64 bit (hoặc 128 bit) hệ điều hành của họ đã được phát triển sau này - và vấn đề tương thích ngược lớn như vậy mà một tên thư mục sẽ gây ra. Hindsight luôn là 20-20, vì vậy tôi không thể đổ lỗi cho họ (quá nhiều) cho một sai lầm như vậy. ... TUY NHIÊN ... Khi Microsoft sau đó đã phát triển hệ điều hành 64 bit của họ, thậm chí với lợi ích của nhận thức muộn, tại sao họ lại không chỉ mắc phải một lỗi chính xác tương tự LẠI mà còn làm cho nó trở nên tồi tệ hơn khi PURPOSEFULLY đưa ra nó là một cái tên sai lệch?!? Thật xấu hổ cho họ !!! Tại sao AT LEAST không thực sự đặt tên cho thư mục "SysWin32OnWin64" để tránh nhầm lẫn?! ? Và điều gì xảy ra khi cuối cùng họ tạo ra một hệ điều hành 128 bit ... vậy thì họ sẽ đặt các tệp DLL 32 bit, 64 bit và 128 bit của mình ở đâu?!?

  2. Tất cả logic này dường như vẫn còn thiếu sót đối với tôi. Trên các phiên bản Windows 32 bit, System32 chứa DLL 32 bit; trên các phiên bản Windows 64 bit, System32 chứa DLL 64 bit ... để các nhà phát triển không phải thay đổi mã, đúng không? Vấn đề với logic này là các nhà phát triển đó hiện đang tạo ra các ứng dụng 64 bit cần DLL 64 bit hoặc họ đang tạo các ứng dụng 32 bit cần DLL 32 bit ... dù sao đi nữa, liệu chúng có còn bị lừa không? Ý tôi là, nếu họ vẫn đang tạo một ứng dụng 32 bit, thì bây giờ nó chạy trên Windows 64 bit, giờ họ sẽ cần thực hiện thay đổi mã để tìm / tham chiếu cùng một DLL 32 bit của họ. được sử dụng trước đây (hiện nằm trong SysWOW64). Hoặc, nếu họ đang làm việc trên một ứng dụng 64 bit, họ sẽ cần phải viết lại ứng dụng cũ của họ cho HĐH mới ... vì vậy dù sao cũng cần phải biên dịch lại / xây dựng lại !!

Microsoft đôi khi chỉ làm tổn thương tô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.