Neden 64-bit DLL'ler 64-bit Windows'da System32 ve 32-bit DLL'ler SysWoW64'e gider?


227

Bir dosyayı ne zaman yerleştirmemiz gerektiğini bilmek istiyorum

C: \ Windows \ System32 veya C: \ Windows \ SysWOW64, 64 bit Windows sisteminde.

Biri 32 bit, biri 64 bit olmak üzere iki DLL'im vardı.

Mantıken, 32-bit DLL C: \ Windows \ System32 altına ve 64-bit DLL C: \ Windows \ SysWOW64 altına yerleştireceğini düşündüm.

Benim için sürpriz, tam tersi ! 32 -bit bir C girer: \ Windows \ SysWOW 64 ve 64 DLL C girer -bit: \ Windows \ System 32 .

Çok kafa karıştırıcı şeyler. Bunun arkasındaki sebep nedir?


2
Ayrıca, bu: Windows geçerli çalışma dizinine ve PATH sistemine bakar. Aksi belirtmenin bir yolu yoktur. Oh bekle, var. Arama yolunu DLL'nize gömebilirsiniz. 8 bayt uzunluğunda bir alandır. Evet. 8 karakter.
Jeroen Baert

Bu, Windows 7'de doğru gibi görünmüyor. C: \ Windows \ system32 \ user32.dll dosyasındaki bir DLL dosyasında çalışan C: \ Windows \ system32 \ user32.dll; MS Windows (DLL) (GUI) Intel için PE32 yürütülebilir 80386 32 bit Ama montaj bu DLL olduğunu unutmayın MS Windows (DLL) (konsol) Mono / .Net için PE32 + çalıştırılabilir yazdıran 64 bit DLL için değil bir .Net montaj. Yerel bir DLL.
user877329


11
Eski bir Microsoftie ile röportaj . (Bunun nasıl olduğuna dair ciddi bir açıklama için bu cevaba bakınız .)
Tgr

superuser.com/a/157301/241386 "Geriye dönük uyumluluk nedenleri. Pek çok uygulama varsayılmaması gereken şeyleri ve sabit kod yollarını varsayar"
phuclv

Yanıtlar:


225

Niyetin System32'yi yeniden adlandırmak olduğuna inanıyorum, ancak bu yol için kodlanmış birçok uygulama, onu kaldırmak mümkün değildi.

SysWoW64, 64-bit sistemlerin dll'leri için tasarlanmamıştır, aslında "Windows64'te Windows" gibi bir şeydir, yani 64bit pencerelerde 32bit uygulamaları çalıştırmak için ihtiyacınız olan bitler.

Bu makale biraz açıklıyor:

"Windows x64, 64-bit DLL (sic!) İçeren bir dizine sahiptir. Bu nedenle 64 bitlik yerel işlemler, kendilerinden bekledikleri" kendi "DLL'lerini bulur: System32 klasöründe. Ikinci bir dizin, SysWOW64, 32 -bit DLLs. Dosya sistemi yeniden yönlendirici 32-bit işlemler için gerçek System32 dizinini gizleme ve System32 adı altında SysWOW64 gösteren sihir yapar. "

Düzenleme: Bir yükleyici bahsediyoruz, gerçekten etmemelidir sistem klasörüne gömmemeli yolunu. Bunun yerine, yükleyicinizin öykünme katmanında çalışıp çalışmadığına bağlı olarak Windows'un sizin için ilgilenmesine izin verin.


27
Ugh, bugün bu tuhaflıkla karşılaştım. Yaptıkları ne yanıltıcı bir şey.
Andy White

16
Bugün de bu koştu ... çok kafa karıştırıcı - Glut 32-bit dll / SysWOW64 girer, Glut 64-bit dll / System32 girer. Birisi bunu yazmalı. İnternette.
Jeroen Baert

8
İyi haber, Microsoft mühendislik dehasının bir örneği olarak, bu neredeyse kendi kendini belgeliyor.
Spike0xff

8
Ben alamadım bir şey, eğer dosya sistemi 32 bit bir uygulama olduğunu söyleyebilir ve SysWOW64klasöre yönlendirmek , bunun yerine neden 64 bit bir uygulama tespit ve bir yönlendirme System64?
Cole Johnson

6
System32, Sistem DLL'lerinin Windows 32 bit sürümüdür. Sistem 16 bit versiyonudur. Bize Windows 8 veren aynı şirket 64 bit işletim sistemi üzerinde çalışırken bize 32 bit DLL ve 64bit DLL için SysWow64 verdi. 64 bit sistemlerde, Sistem klasörü hala eski 16 bit önemsizdir, sadece System32 önerildiği gibi 32bit değildir ve 32 bit şeyler 64 adında Sistem dizinindedir. Bunun kimseye nasıl yardım ettiğini göremiyorum. her şeyi karmaşıklaştırır ve her şeyi kırar. Tüm insanlar 64bit dönüştürürken sabit kodlu "System32" "System64" uyarlamaktan kurtarmak için. Aptallık
Armand

26

Ben eklemeliyim: Sen zaten \ system32 \ içine dll's koyarak olmamalı! Kodunuzu değiştirin, yükleyicinizi değiştirin ... bitleriniz için c: \ windows \ altında bir yerde OLMAYAN bir ev bulun

Örneğin, yükleyiciniz dll'lerinizi koyar:

\program files\<your app dir>\

or

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

( Not : Gerçekte bunu yapmanın yolu , Program Dosyalarının nerede olduğunu bulmak için var:% ProgramFiles% veya% ProgramFiles (x86)% ortamını kullanmaktır ... bunun c: \ program files \ olduğunu varsaymazsınız. ..)

ve ardından bir kayıt defteri etiketi ayarlar:

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

Dll'lerinizi kullanan kod, kayıt defterini okur ve dinamik olarak o konumdaki dll'lere bağlanır.

Yukarıdakiler akıllıca bir yol.

Hiçbir zaman dll'lerinizi veya üçüncü taraf dll'lerini \ system32 \ veya \ syswow64 içine kurmazsınız. Eğer statik olarak yüklemek zorunda kalırsanız, exe dir dlls koymak (nerede bulunur). Eğer exe dir tahmin edemez (örneğin diğer bazı exe dll arayacaksınız), arama yoluna dll dir koymak zorunda kalabilirsiniz (hiç poss!

system32 ve syswow64 Windows tarafından sağlanan dosyalar içindir ... başkalarının dosyaları için değil . İnsanların her zaman arama yolunda olması ve birçok uygulama / modül statik bağlantı kullanması nedeniyle bir şeyler koyma alışkanlığına girmenin tek nedeni. (Yani, gerçekten aşağı inerseniz, gerçek günah statik bağlantı - bu yerel kod ve yönetilen kod bir günah - her zaman her zaman dinamik olarak bağlantı!)


9
+1 ... ancak şunu ekleyeceğim:% PROGRAMFILES% değil \ Program Files \ değil
Rod MacPherson

XP günlerinde, geliştiricilerin bu tür şeyler için kayıt defterini kullanmaları yaygın bir (ve önerilen) uygulamadır. Windows 7 ile bu artık doğru değil! UAC, çoklu kullanıcı oturumları, vb. Nedenlerle. Windows 7'deki kayıt defteri geliştiriciler tarafından az miktarda ve takdirle kullanılmalıdır.
ryyker

@RodMacPherson Yanıtınızı, önerinizi dikkate almak üzere geliştirdik. Haklısın!
Jonesome, Monica'yı

Biraz düşündükten sonra, bunun soruyu daha iyi yanıtladığını düşünüyorum - "Ne zaman% SYSTEMROOT% altına bir dosya yerleştirmemiz gerekiyor". Asla. Bu yanıt syswow64 klasörü hakkındaki merakları tatmin etmiyor, ancak geliştiricilerin gerçekten okuması gereken tek şey.
Thomas

7

Aynı sorunla karşılaştı ve bunu birkaç dakika araştırdı.

Windows 3.1 ve DOS kullanmayı öğrettim, o günleri hatırlıyor musunuz? Kısa bir süre Macintosh bilgisayarlarla çalıştıktan kısa bir süre sonra, bir x64 bit makine satın aldıktan sonra Windows'a geri dönmeye başladı.

Bu değişikliklerin arkasında (bazıları tarihsel öneme sahip olabilir), programcıların çalışmalarına devam etmeleri için gerekli olan gerçek nedenler vardır.

Değişikliklerin çoğu yukarıda belirtilmiştir:

  • Program Files vs Program Files (x86)

    Başlangıçta 16 / 86bit dosyalar '86' Intel işlemciler üzerine yazılmıştır.

  • System32gerçekten System64(64 bit Windows'ta)

    Geliştiriciler Windows7 ile ilk kez çalışmaya başladığında, diğer uygulamaların depolandığı çeşitli uyumluluk sorunları vardı.

  • SysWOW64 gerçekten demek SysWOW32

    Esasen, basit bir şekilde, '64 bitlik bir makinede Windows'ta Windows' anlamına gelir . Her klasör, DLL'lerin kullanmak istedikleri uygulamalar için nerede bulunduğunu gösterir.

İhtiyacınız olan tüm temel bilgileri içeren iki bağlantı:

Umarım bu şeyleri temizler!


4
Ciddiye alınmak istiyorsanız, muhtemelen argoyu tonlamalı ve dilbilgisini geliştirmelisiniz. Ayrıca, cevabınızı biraz daha yapılandırmak, paragraflar kullanmak isteyebilirsiniz.
Klas Mellbourn

2
@Crispy cevabı temizledi. Gelecekte, Klas'ın ne önerdiğini düşünmeli ve yanıtlarınızı artırmak için yanıtınızı biçimlendirmelisiniz. :)
RekindledPhoenix

OP'nin tamamen yeniden yazılması veya hatta kaldırılması gerekir. Yanıltıcı ve gerçekten kullanışlı değil.
Jonesome Reinstate Monica

5
SysWOW64 aslında şu anlama gelir: [Sys] tem [W] 32 bit [o] n [W] indows [64] -bit böylece kısaltılmış SysWoW64 formu (gerçekten bir anlam ifade etmez ve Microsoft'un System32'yi 32bit şeyler için bırakmış olması gerekir) ve bir System64 oluşturduysa, gerçekten uyumluluk sorunları olmaz. Microsoft'un WoW sanal alanında yaptığı şey, SysWoW64'e bir istek olarak System32'ye 32bit erişimden bir bellek yönlendirmesi oluşturmaktır ... bu sadece ifşa etmekten daha karmaşık değil ? sihirli remap bunu farklı platformlar için zorunda w / o ham dosya sistemi gibi, bir önceki açıklamada belirtildiği - idiocy.
Armand

1
cevap soruya açıklıktan daha fazla yanlış anlama getiriyor, Armands yorum iyi bir açıklama.
nahab

5

System32, Windows'un 32bit DLL'lerin tümünü yerleştirdiği ve Sistem 16bit DLL'lerin içindeydi. Microsoft 64 bit işletim sistemini oluşturduğunda, tanıdığım herkes dosyaların System64 altında kalmasını bekledi, ancak Microsoft, 64bit dosyaları System32 altına koymanın daha mantıklı olduğuna karar verdi. Bulabildiğim tek sebep, 32bit olan her şeyin programlardaki herhangi bir şeyi değiştirmek zorunda kalmadan 64bit Windows'da çalışmasını istedikleri - sadece derlemek ve bitti. 32bit uygulamaların hala çalışabilmesi için bunu çözme biçimleri, Windows64'te Windows32 adlı bir 32bit Windows alt sistemi oluşturmaktı. Bu nedenle, 32 bit alt sisteminin Sistem dizini için SysWOW64 kısaltması oluşturuldu. Sys, System kısaltması ve WOW64, Windows32OnWindows64 kısaltmasıdır.
Windows 16 zaten Windows 32'den ayrıldığından, Windows 64 On Windows 64 eşdeğerine gerek yoktu. 32bit alt sisteminde, bir program system32 dizinindeki dosyaları kullanmaya gittiğinde, dosyaları aslında SysWOW64 dizininden alırlar. Ancak süreç kusurludur.

Korkunç bir tasarım. Ve tecrübelerime göre, 64bit uygulamaları yazmak için çok daha fazla değişiklik yapmak zorunda kaldım, sadece System32 dizinini System64 okumak için değiştirmek çok küçük bir değişiklik olurdu ve derleyici öncesi yönergeleri işlemek için tasarlanmıştır.


2

Diğer millet zaten bu alaycı bilmeceyi açıklamak için iyi bir iş çıkardı ... ve sanırım Chris Hoffman burada daha iyi bir iş çıkardı: https://www.howtogeek.com/326509/whats-the-difference-between-the- system32-ve-syswow64 klasörler-içinde-pencere /

İki düşüncem:

  1. Hepimiz hayatta aptalca kısa görüşlü hatalar yaparız. Microsoft (o zaman) Win32 DLL dizinini "System32" olarak adlandırdığında, o zaman mantıklıydı ... sadece 64-bit (veya 128-bit) bir versiyonda / ne zaman ne olacağını dikkate almadılar işletim sistemlerinin daha sonra geliştirildi - ve böyle bir dizin adının neden olacağı büyük geriye dönük uyumluluk sorunu. Gez her zaman 20-20'dir, bu yüzden böyle bir hata için onları (çok fazla) gerçekten suçlayamam. ... NASIL ... Microsoft daha sonra 64-bit işletim sistemlerini, gezinin faydasıyla bile geliştirdiğinde, neden ah neden sadece aynı kısa görüşlü hatayı TEKRAR yapmakla kalmıyor, aynı zamanda PURPOSEFULLY vererek daha da kötüleştiriyorlar? böyle yanıltıcı bir isim?!? Ayıp onlara!!! Neden AT LEAST aslında karışıklığı önlemek için "SysWin32OnWin64" dizini adlandırmıyor ?! ? Ve sonunda 128 bit işletim sistemi ürettiklerinde ne olur ... o zaman 32 bit, 64 bit ve 128 bit DLL'lerini nereye koyacaklar?!?

  2. Bütün bu mantık hala tamamen kusurlu görünüyor. Windows'un 32 bit sürümlerinde, System32 32 bit DLL dosyaları içerir; 64-bit Windows sürümlerinde, System32 64-bit DLL içerir ... böylece geliştiriciler kod değişiklikleri yapmak zorunda kalmazsınız, değil mi? Bu mantığın sorunu şu ki, bu geliştiriciler ya 64-bit DLL'lere ihtiyaç duyan 64-bit uygulamalar yapıyorlar ya da 32-bit DLL'lere ihtiyaç duyan 32-bit uygulamalar yapıyorlar ... her iki durumda da, hala vidalı değiller mi? Yani, hala 32 bit bir uygulama yapıyorlarsa, şimdi 64 bit Windows üzerinde çalışabilmeleri için, şimdi aynı 32 bit DLL dosyasını bulmak / referans almak için bir kod değişikliği yapmaları gerekecek. daha önce kullanıldı (şimdi SysWOW64 konumunda bulunuyor). Ya da, 64 bit bir uygulama üzerinde çalışıyorlarsa, eski uygulamalarını yeni işletim sistemi için yeniden yazmaları gerekecek ... yine de yeniden derleme / yeniden oluşturma gerekli olacaktı!

Microsoft bazen beni incitiyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.