Bir dll'den fonksiyonları çağırma ve sonuçları döndürme - sayfa 5

 
Korumalı - iyi, çok zayıf - kötü. Ve dll çağırma yeteneği ile ne korunur? smile Yine de dll ve td'yi aramayı yasaklamak kesinlikle mümkün. vb. Yürütülmek üzere bir grup görevi uzmanın dosyalar dizinine atma fikrine sahipken FindFirst ve FindNext'e ihtiyacım vardı, böylece o onları sıralayıp yürüttü. Şekil ortaya çıktı.
 
Ve dll çağırma yeteneği ile ne korunur? :)

Sadece ayarlara bakın - her şey devre dışı (DLL'ler varsayılan olarak devre dışıdır):

 
Dll'mi ne zaman bağladığımı biliyorum. Sadece dll ithalatına izin veriliyorsa, ne tür bir korumadan bahsediyoruz?
 
_Varsayılan_ olarak, bir DLL'den içe aktarma _totally_disabled_ olur. Bu korumadır.
Herhangi biri harici DLL kullanmak isterse, "Her DLL işlevinin çağrısını onayla" düğmesini açmanız ve orada ne çağrıldığına bakmanız yeterlidir. Bu da korumadır. Tüm yerleşik dosya işlemlerini yalnızca /history ve /files dizinlerine erişimle korumanın yanı sıra.
 
2 mike: aptal soru için üzgünüm. Delphi derlenmiş dll'leri çalıştırılamıyor. Pol da benzer bir sorunla karşılaştı ( "Dizileri ve dizeleri DLL'ye (Delphi) geçirme" ), ancak orada kimse ona yanıt vermedi. Bana nasıl yaptığını söyler misin?
 
Sorun nedir? İşte çalışan bir dll örneği (ilgili olmayan her şeyi attım):

kütüphane MetaDLL;

kullanır
sissutiller,
sınıflar,
pencereler;

{$R *.res}

{-----Başlat ------------------------------------- ------ ------------}
prosedür InitDllData(CurrencyName: PChar); standart çağrı;
başlamak
// bir şey yap
son;

{-----Sonlandırmak------------------------------------- ------ --------------}
prosedür FreeDllData; standart çağrı;
başlamak
// bir şey yap
son;

{----İşlem işareti------------------------------------------------ -----------------}
prosedür ProcessTick(CurrencyName: PChar; teklif, sor: çift; zaman: tamsayı); standart çağrı;
var
f:dosya;
TarihSaat:TDateTime;
başlamak
denemek
AssignFile(f, WorkDir + Para BirimiAdı + '.tik');
denemek
sıfırla(f, 1);
dışında
yeniden yaz(f, 1);
son;

denemek
DateTime := MTTimeToNormal(zaman);
ara(f, DosyaBoyutu(f));
BlockWrite(f, DateTime, sizeof(DateTime));
BlockWrite(f, teklif, sizeof(teklif));
Sonunda
Dosyayı Kapat(f);
son;
dışında
//
son;
son;


ihracat
ProcessTick, InitDllData, FreeDllData;

son.

Tüm işlevlerinizi stdcall olarak ayarlamayı unutmayın, yalnızca standart Windows türlerini (yalnızca PChar olarak dizeler) kullanın, ayrıca dışa aktarılan tüm işlevleri dışa aktarma yönergesinde belirtmeyi unutmayın, mutlu olacaksınız.

Evet, ayrıca Renat'ın ekspertizde dll kullanımına nasıl izin verileceği konusunda yayınladığı resme bakın.
 
Ayrıca dll'nin <metatrader>\experts\libraries\ dizininde bulunması gerektiğini ve uzman kodunda şöyle bağlandığını eklemeyi unuttum:

#import "MetaDLL.dll"
void ProcessTick(string CurrencyName, double aBid, double aAsk, int aTime);
void InitDllData(dize Para BirimiAdı);
geçersiz FreeDllData();

ve sonra zaten herhangi bir işlevi çekebilirsiniz
 
Yardım için teşekkürler. Dizinin, dll'den çağrılan işlevin bir parametresi olarak yanlış bir şekilde çağrıldığı ortaya çıktı.
 
Sorun nedir? İşte çalışan bir dll örneği (ilgili olmayan her şeyi attım):

kütüphane MetaDLL;

kullanır
sissutiller,
sınıflar,
pencereler;
...


Başka bir aptal soru için özür dilerim: Bu DLL'de bir VCL kullanmak mümkün mü (daha doğrusu anladınız mı)? Ve sonra "form" ddl'ye bağlandığımda, MetaTrader başlatıldığında (veya ilgili danışman bağlandığında) bile bir "hata" ile çöküyor.
Aslında sadece TDatabase, TDataSource, TQuery ile ilgileniyorum
 
2 mikrofon
Öykünücünüzle çok ilgilendim, tarih üzerinde pratik yapabileceğiniz bir şey. Maalesef bildiğim kadarıyla MT bunu yapmayacak. Anladığım kadarıyla Forex'te iyi para kazandığınız için gerçekten satmak istemiyorsunuz. Ancak internette uzun süredir benzer bir şey arıyordum, şimdiye kadar başarılı olamadım. Geliştirmenizi kullanmama izin verirseniz sevinirim. Benim açımdan size MTS'yi önerebilirim, belki de ilginizi çekebilecek tek şey bu.
İşbirliğini umuyorum, Alexander. f1-forum@mail.ru
Neden: