dll nasıl kaldırılır - sayfa 2

 
OneDepo >> :

WinAPI'de UnloadLibrary() işlevi yoktur, FreeLibrary() vardır.

Haklısın :-). Nedense MSDN benim için yüklenmedi :-).

.

OneDepo >> :

İşletim sistemi, yalnızca yük sayacı değeri sıfır olduğunda herhangi bir dll'yi kaldırır.

Bu durumda, dll'yi yükleyen tek uygulama metatrader'dır.

 
jartmailru >> :

Bu durumda, dll'yi yükleyen tek uygulama metatrader'dır.

Konu bu değil, en az on uygulama. Buradaki fikir, sayaçla oynamaktır, eğer gerçekten dll'yi boşaltmak istiyorsanız, o zaman sayacı sıfırlamayı denemeniz gerekir. Konuyu başlatan fikir, te sezat ;)
 
njel >> :

#import yoluyla harici bir kitaplık kullanarak.


idnikator'ı boşalttığımda, terminal hala dll'yi tutuyor. nasıl kurtulunur?

Dll'yi hatasız yazın. Öngörülemeyen durumlar yoksa, genellikle dll'ler kendiliğinden boşaltılır.


Herhangi bir "hacker" yolu dışında - mümkün olan tek şey bu.

 
Windows herhangi bir DLL dosyasını önbelleğe alır. Yoğun şekilde önbelleğe alındı.
 
HideYourRichess >> :

Dll'yi hatasız yazın. Öngörülemeyen durumlar yoksa, genellikle dll'ler kendiliğinden boşaltılır.

Peki canım.

Elimde yeni bir Dll vardı ve ciddi olarak yanıldığını kanıtlamaya karar verdim :-).

Senaryodan çıktıktan sonra ve göstergeden çıktıktan sonra ortaya çıktı.

(pencereyi kapatarak veya göstergeyi kaldırarak), Dll kaldırılır...

Ve "okuryazarlık" ile ilgili olarak... Bu DllMain bana her zaman aptalca DOĞRU döndürür.

Ama yaklaşık bir yıl önce Dll'yi değiştirmek için metatrader'dan çıkmam gerektiğini hatırlıyorum.

İşletim Sistemi=WinXP SP3, MT=225

 

Çocuklar, biraz tuhafsınız ya da öyle bir şey. Boşalmayacağı gibi sorunlar yaşadım, sadece birkaç kez oldu ve her zaman koddaki hatalarla ilişkilendirildi. Bu ilk. İkinci. Bu örtük yükleme / boşaltma mekanizmasının Microsoft tarafından Dll ile çalışmayı basitleştirmek için özel olarak icat edildiğini hatırlatırım.


Bu garip sorunları nereden alıyorsunuz - anlamayı reddediyorum.


Evet ve bu, kişisel olarak doğrudan DllMain kullanmıyorum.

 
HideYourRichess >> :

Çocuklar, biraz tuhafsınız ya da öyle bir şey. Boşalmayacağı gibi sorunlar yaşadım, sadece birkaç kez oldu ve her zaman koddaki hatalarla ilişkilendirildi.


Bu garip sorunları nereden alıyorsunuz - anlamayı reddediyorum.


Evet ve bu, kişisel olarak doğrudan DllMain kullanmıyorum.

İşte buradasınız, "bizim garipsiniz", MSDN'den bir alıntı:
"Sistem DLL_PROCESS_ATTACH dışında herhangi bir değerle DllMain işlevini çağırdığında, dönüş değeri yok sayılır."

Onlar. Dll-in'leri boşaltırken, sistem orada bir programcı olarak kendiniz hakkında ne düşündüğünüzü kesinlikle umursamıyor.

Doğru ya da yanlış yazılamaz - içinde değilseniz, sadece ortaya çıkar. Mümkünse.

.

Ancak kendinizi bir profesyonel olarak gördüğünüze göre, muhtemelen şakalar yerine yeni başlayanlara tavsiyelerde bulunabilirsiniz.

Özünde bir şey yazdığınızı görmüyorum - projeden dinamik bağlantıyı kaldırın,

çalışma zamanı paketlerine bağımlılıklar, ilgili DLL'lerle çalışmayı dikkatlice organize edin - olası değildir

elbette orada kullanılır ve muhtemelen OleInitialize gibi tek bir çağrının artabileceği COM alt sistemiyle çalışır.

birkaç düzine sistem Dll-in. Tüm bu bağımlılıklar aynı anda yüklendiğinden ... o zaman başlangıçta her şey kolaydır,

ancak başlatmadan arındırma ile - örneğin, hem Dll hem de metatrader aynı sistem kitaplıklarını bağlarsa -

sorunlar olabilir - işletim sisteminin derinliklerinde ne olduğunu kim bilebilir.

.

Yani aslında - biz - tüm Dll işlevlerini bağlayan bir API kullanıcısı olarak - genellikle - .h / .lib aracılığıyla ve kitaplıkları yükleyerek,

büyük olasılıkla, uygulamanın başlatılması sırasında olur, *hiçbir şey yapamayız*.

Veya tüm kütüphaneleri kendimiz yükler ve tüm fonksiyonları dinamik olarak elle bağlardık.

Ancak çıplak matematikte - veya bazı API işlevlerinde - her şey yolunda olmalıdır.


AlexEro >> :
Windows herhangi bir DLL dosyasını önbelleğe alır. Yoğun şekilde önbelleğe alındı.

Yukarıdakilerle bağlantılı olarak, gerçeğe oldukça yakın çıkıyor. Onlar. Dll-ina bağımlılıkları kancalarsa -

o zaman işletim sistemi, bu Dll'yi yükleyen uygulamayı kaldırmadan artık onu kaldıramaz.

 
jartmailru >> :

İşte buradasınız, "bizim garipsiniz", MSDN'den bir alıntı:
"Sistem DLL_PROCESS_ATTACH dışında herhangi bir değerle DllMain işlevini çağırdığında, dönüş değeri yok sayılır."

Onlar. Dll-in'leri boşaltırken, sistem orada bir programcı olarak kendiniz hakkında ne düşündüğünüzü kesinlikle umursamıyor.

Doğru ya da yanlış yazılamaz - içinde değilseniz, sadece ortaya çıkar. Mümkünse.


Özellikle yetenekli olanlar için bir kez daha tekrar ediyorum - dll hatasız yazılmışsa - her şey beklendiği gibi çalışmalıdır. Geç bağlama ile yüklenen kitaplıkları boşaltmak için özel bir mekanizma yoktur. Bu temiz?! MQL4, Load\FreeLibrary aracılığıyla açık Dll yükleme/boşaltma ile ilişkili bir hizmet sağlamaz. Benzer şekilde, Sonlandırma'ya erişim yoktur.

jartmailru >> :

Ancak kendinizi bir profesyonel olarak gördüğünüze göre, muhtemelen şakalar yerine yeni başlayanlara tavsiyelerde bulunabilirsiniz -

Özünde bir şey yazdığınızı görmüyorum - projeden dinamik bağlantıyı kaldırın,

çalışma zamanı paketlerine bağımlılıklar, ilgili DLL'lerle çalışmayı dikkatlice organize edin - olası değildir

elbette orada kullanılır ve muhtemelen OleInitialize gibi tek bir çağrının artabileceği COM alt sistemiyle çalışır.

birkaç düzine sistem Dll-in. Tüm bu bağımlılıklar aynı anda yüklendiğinden ... o zaman başlangıçta her şey kolaydır,

ancak başlatmadan arındırma ile - örneğin, hem Dll hem de metatrader aynı sistem kitaplıklarını bağlarsa -

sorunlar olabilir - işletim sisteminin derinliklerinde ne olduğunu kim bilebilir.


Richter'i okuyun, şiddetle tavsiye ederim. Dll'lerle çalışmanın hiçbir sihir olmadığı ve kütüphanelerin, işlemin mevcut adres alanı için artık gerekli olmadığı anda her zaman kaldırıldığı anlaşılacaktır. Bu ihtiyaç sayaç tarafından belirlenir. MQL programı kaldırıldığında sayaç sıfırlanmadıysa, bu bir yerde bir hata meydana geldiği ve bunda büyük bir hata olduğu anlamına gelir.

jartmailru >> :

Yani aslında - biz - tüm Dll işlevlerini bağlayan bir API kullanıcısı olarak - genellikle - .h / .lib aracılığıyla ve kitaplıkları yükleyerek,

büyük olasılıkla, uygulamanın başlatılması sırasında olur, *hiçbir şey yapamayız*.

Veya tüm kütüphaneleri kendimiz yükler ve tüm fonksiyonları dinamik olarak elle bağlardık.

Ancak çıplak matematikte - veya bazı API işlevlerinde - her şey yolunda olmalıdır.


Yukarıdakilerle bağlantılı olarak, gerçeğe oldukça yakın çıkıyor. Onlar. Dll-ina bağımlılıkları kancalarsa -

o zaman işletim sistemi, bu Dll'yi yükleyen uygulamayı kaldırmadan artık onu kaldıramaz.

MT4 geliştiricileri, kullanıcılara Load\FreeLibrary mekanizmasını vermeyerek çok güzel bir şey yaptılar. Çok doğru. Her şey programlama tüccarlarının kültür seviyesi ile ilgili.


Ve son olarak, Microsoft'un önerilerini okuyun - siyah beyaz olarak, kendi aralarında karmaşık dll bağımlılıkları yapmanın mümkün olmasına rağmen, tüm bunların sınırlamaları olduğu belirtilir.

 
AlexEro >> :
Windows herhangi bir DLL dosyasını önbelleğe alır. Yoğun şekilde önbelleğe alındı.

Bir dll'yi bir sürecin adres alanına eşleme mekanizmasını bir önbelleğe alma mekanizması olarak adlandırmazdım. Bu tamamen bağımsız bir süreçtir.

 
HideYourRichess >> :

Bir dll'yi bir sürecin adres alanına eşleme mekanizmasını bir önbelleğe alma mekanizması olarak adlandırmazdım. Bu tamamen bağımsız bir süreçtir.

Sen biraz tuhafsın. Windows\system32 dizininde bir dllcache dizini bile var, dünyadaki tüm sistem yöneticileri regsvr32 kullanarak tüm dll'leri zorla kaldırıyor ve burada insanlara masal anlatıyorsunuz. Kime güveniyorsun? Burada aynı değil pislikler toplandı.