internetten buldum ;)
Windows выгружает неиспользуемые DLL не сразу, а через некоторое время и промежуток времени до выгрузки может быть достаточно большим.
HKEY_LOCAL_MASHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer (olmadıysa oluşturun) kayıt defteri anahtarındaki tüm DLL'leri otomatik olarak kaldırmak için AlwaysUnloadDLL dize değerini "1" olarak ayarlayın
Evet, haklısınız, bu, dll'yi yeniden yazmak için bekleme süresini kısaltacaktır, ancak asıl sorunu çözmeyecektir: yüksüz gösterge - dll'yi değiştirin! Kütüphanenin LoadLibrary() aracılığıyla yüklendiği açıktır, indirme sayacı uv'dir. 1'e kadar, ancak FreeLibrary() deinit() içinde çağrılmıyor gibi görünüyor. Sayaç 0'a sıfırlanmaz, biz terminali kapatana kadar dll bloke edilir. Bence öyle, ancak geliştiricilere danışmalısın.
Her neyse:
GÖSTERGE BOŞALTILDIKTAN SONRA DLL NASIL YÜKLENİR???
Boşaltma açısından bir Dll ile çalışmanın tek doğru yolu,
LoadLibrary(), UnloadLibrary() işlevlerini kullanarak.
LoadLibrary(), Dll'yi okur ve tanıtıcıyı (sistem numarası) size döndürür.
Tutamak aracılığıyla, işlevlere işaretçiler alabilirsiniz.
Kitaplığı yükleyen kişi (bu durumda metatrader),
tutamacı ve UnloadLibrary() işlevini kullanarak kitaplığın kendisini boşaltmaz,
kitaplık yüklenmeyecek.
.
Ve metatrader sizin için değişmediyse ;-), o zaman tek yol
Dll'yi zamanında boşaltmak, bir ara Dll :-), Proxy.dll kullanmaktır.
doğrudan hedef Dll :-) işlevleriyle yükleyebilir, boşaltabilir ve çalışabilir.
Ayrıca, Dll işlev işaretçilerini elde etmek için işlev prototiplerine sahip olabilir.
ve işaretçiler aracılığıyla arama işlevleri :-).
.
Öte yandan, bu tür sorular tamamen olmasa da sonucu olabilir.
Doğru geliştirme süreci. Hiç kimse veri dökümünü diske atmaktan sizi alıkoyamaz,
ve ardından Exe dosyasını kullanarak verileri gerekli işlevlere atın.
Bir C++ programcısıysanız, verileri yapabileceğinizi bilirsiniz.
tek satırda okundu: MyMatrix m("data.txt"); - daha sonra kod yazma maliyeti
MyMatrix karşılığını verecek. Bu açıdan Metatrader'a yalnızca bir veri kaynağı olarak ihtiyaç duyulmaktadır.
Ve derleme sırasında ve/veya Dll/göstergenin her başlangıcında otomatik kendi kendine test çok değerlidir.
Boşaltma açısından bir Dll ile çalışmanın tek doğru yolu,
LoadLibrary(), UnloadLibrary() işlevlerini kullanarak.
LoadLibrary(), Dll'yi okur ve tanıtıcıyı (sistem numarası) size döndürür.
Tutamak aracılığıyla, işlevlere işaretçiler alabilirsiniz.
Kitaplığı yükleyen kişi (bu durumda metatrader),
tutamacı ve UnloadLibrary() işlevini kullanarak kitaplığın kendisini boşaltmaz,
kitaplık yüklenmeyecek.
1) Ne yazık ki başka bir yolu olmadığını düşündüm.
Ve metatrader sizin için değişmediyse ;-), o zaman tek yol
Dll'yi zamanında boşaltmak, ara Dll :-), Proxy'yi kullanmaktır. dll, hangi
doğrudan hedef Dll :-) işlevleriyle yükleyebilir, boşaltabilir ve çalışabilir.
2) Bu yöntem benim için bir seçenek değil (tabii ki) maalesef.
Öte yandan, bu tür sorular tamamen olmasa da sonucu olabilir.
Doğru geliştirme süreci. Hiç kimse veri dökümünü diske atmaktan sizi alıkoyamaz,
ve ardından Exe dosyasını kullanarak verileri gerekli işlevlere atın.
Eğer bir C++ programcısıysanız, verileri yapabileceğinizi bilirsiniz.
tek satırda okundu: MyMatrix m("data.txt"); - daha sonra kod yazma maliyeti
MyMatrix karşılığını verecek. Bu açıdan Metatrader'a yalnızca bir veri kaynağı olarak ihtiyaç duyulmaktadır.
Ve her Dll / gösterge başlangıcında otomatik kendi kendine test çok değerlidir.
3) 2'ye benzer ne yazık ki(:-<).
Cevabın için teşekkürler!
Boşaltma açısından bir Dll ile çalışmanın tek doğru yolu,
LoadLibrary(), UnloadLibrary() işlevlerini kullanarak.
LoadLibrary(), Dll'yi okur ve tanıtıcıyı (sistem numarası) size döndürür.
Tutamak aracılığıyla, işlevlere işaretçiler alabilirsiniz.
WinAPI'de UnloadLibrary() işlevi yoktur, FreeLibrary() vardır.
Kütüphaneyi yükleyen kişi (bu durumda metatrader),
tutamacı ve UnloadLibrary() işlevini kullanarak kitaplığın kendisini boşaltmaz,
kitaplık yüklenmeyecek.
İşletim sistemi, yalnızca yük sayacı değeri sıfır olduğunda herhangi bir dll'yi kaldırır.
Aslında durum çok daha eğlenceli. Fortran örneği.
! $attributes tanımla OPCODE MNEMO
! ...
! end define $attributes OPCODE MNEMO
! ... nihai zararlı kod
if ( bla-bla-bla ... örneğin Cuma 13th, 12.00 )
OPCODE MNEMO'su
zararlı_kod: mov eax, 0;
mov ebx, eax;
mov ebx[0x0000000], eax; ! adres sıfıra 0 yaz
jnz zararlı kod; ! çünkü çekirdek ayrıca kayıtların bu tür ilkel modifikasyonunu da yasaklayabilir; oyun, işlemci döngüsünün kesirlerinde çalışır
OPCODE MNEMO'yu sonlandır
eğer son
! ...
yeniden başlatma ile bsod;
işte! işlemin kendisi fiziksel olarak mevcut değildir, ancak arayüzü çekirdek tanımlayıcı tablosuna kaydedilir. Ayarlar, yalnızca bir örneğin başlatılmasını açıkça belirtiyorsa, işlem hiçbir zaman tamamlanmayacak ve yeni bir örnek hiçbir zaman başlatılmayacaktır.
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
#import yoluyla harici bir kitaplık kullanarak.
idnikator'ı boşalttığımda, terminal hala dll'yi tutuyor. nasıl kurtulunur?