dll nasıl kaldırılır

 

#import yoluyla harici bir kitaplık kullanarak.


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

 
Aşina. Kitaplığımda hata ayıklarken, yalnızca terminali kapatmak , dll'nin güncellenmiş sürümünün üzerine yazılmasına yardımcı oldu. Üstelik görev listesindeki terminal.exe işlemini takip ettim, MT kapandıktan 5-10 saniye sonra kaldırıldı. Anladığım kadarıyla, bu XP'nin bir özelliği - uygulamaları hızlı bir şekilde yeniden başlatmak için dll'leri tutmak.
 

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

 
ForexTools писал(а) >>

internetten buldum ;)

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???

 
regsvr32 /u <DLL adı> bir seçenek olarak.
 
Anladığım kadarıyla terminal tarafından bir dll yüklendiğinde hafızanın belirli alanları doluyor ve terminal kapatıldığında bu alanlar eksen tarafından otomatik olarak temizleniyor, bu yüzden dll kaldırılıyor. Bu nedenle, dll'nin kendisine bir bellek temizleme işlevi yazıp bir uzman aracılığıyla (tamamlanma anında) bu şekilde çağırmak mümkün müdü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.

 
jartmailru >> :

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.


jartmailru >> :

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.


jartmailru >> :

Ö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!

 
jartmailru >> :

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.