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

 
Daha sonra f1-forumu
Mike = Terranin = ben :) Ve zaten size emülatörü Alpari forumunda vermiştim. Emülatörümde kaç tane çöktüğünü bilseydin, özellikle MTS ile ilgilenmiyorum ... :)
 
2 mikrofon
:)) Ben de öyle düşünmüştüm. Ve sistemim hakkında, aniden ilgilenirseniz, buraya bakabilirsiniz.
http://forum.alpari-idc.ru/viewtopic.php?t=45555
Orada, elbette, bir bodyagu yaktılar ...
Dilerseniz emülatör konusunda yardımcı olduğunuz için sistemi anlatayım.
 
Tamam, murdoc (at) newmail.ru'da paylaşmak istiyorsanız. Boş zamanım olduğunda, test cihazımda çalıştıracağım ve sonuçları bildireceğim.
 
Renat:
_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 denildiğini görmeniz 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.

Belirli bir kişi DLL'si ile halka bir uzman sunarsa, kullanıcı bu DLL'ye güvenir veya güvenmez. Güvenmiyorsa, indirmez, güveniyorsa, herhangi biri için "DLL'den işlevlerin içe aktarılmasına izin ver" kutusunu işaretlemeniz gerekir, aksi takdirde uzman çalışmaz. Çağrılan işlevlerin adları da ona yararlı bir şey söylemeyecektir, çünkü bazı işlevlerin ne yaptığını bulmak için bu DLL'nin herkesin yapamayacağı şekilde demonte edilmesi gerekecektir. Ve bu DLL'de birçok kirli numara yapabilirsiniz, MT terminali bunu engelleyemez. Dolayısıyla "koruma" çok koşulludur ve bu bağlamda gerçek bir savunma değildir. Sanırım Mike'ın demek istediği buydu.

MT 4 Expert Advisors'daki özel DLL'lerden işlevleri çağırma yeteneği, MT 3'teki API'nin yerini alacak şekilde konumlandırılmıştır. Böylece, MT 4 terminalini bir veri akışına dönüştürmek ve sipariş vermek hala mümkündür. API'nin neden kaldırıldığı (forumlardaki çeşitli konulara göre değerlendirilerek) hakkında. Ama fırsat kaldı, çok elverişsiz, birçok kullanıcı bundan bahsediyor ve durumu ".... umrumda değil, bıktığın sürece" şakasından hatırlatıyor. Ve bu konu bunun fazlasıyla yeterli kanıtı. Yazar, sorularına hiçbir zaman somut ve bilgilendirici cevaplar alamadı. Benim için bu sorular da alakalı, cevapları daha da alakalı :-).
Belki ben de programlama konusunda çok uzakta değilim, ancak mevcut sistemde, bir uzman <-> DLL'nin tanımı gereği basit ve güzel bir çözümü olamaz. Daha doğrusu MQL4 dili çerçevesinde güzel bir çözüm olabilir ama MT 4 terminalinin kullanıcı yazılımı ile entegrasyonu çerçevesinde bu, en hafif tabirle saçmalık. Başka, daha işlevsel çözümler var, sadece bulunmaları gerekiyor :-). Örneğin, bu seçenek: mtapi.dll'deki gibi işlevlere sahip, ancak işlem merkezi sunucusuyla değil, istemcinin bilgisayarındaki terminalle etkileşime girecek bir DLL oluşturma. Bu durumda, geliştirici şirketin çıkarları gözlemlenecek (MT 4 terminali olmadan DLL çalışamayacak) ve kendi elleriyle MQL4 uzmanlarından daha karmaşık bir şey yaratabilen insanlar normal bir fırsata sahip olacaklar. yazılımlarını (gui'niz dahil) ticaret sistemiyle entegre edin. Bu seçenek zaten düşünülmüş ve tartışılmışsa, lütfen bağlantı verin (böyle bir şey görmedim). Eğer dikkate alınmazsa, geliştiricilerin bu konudaki görüşlerini bilmek isterim.

Not İşlem terminalinin reklamında/açıklamasında yer alan "istemci API'sini kullanma yeteneği" satırı çok çekici. Bu beni bir zamanlar MetaTrader'a çeken şeydi ve terminalin 4. versiyonunda bir API olmaması beni çok hayal kırıklığına uğrattı. Bir yandan geliştiricilerin, diğer yandan API'yi kullanmak isteyenlerin hala bir uzlaşmaya varacağını umuyorum. Mevcut durum (uzmanlardan DLL işlevlerini çağırıyor) tatmin edici değil.
 
Burada bir sorunla karşılaştım, belki de çok yavaşlıyorum elbette ve bir şey izlemeyi bitirmedim .....

VC++ için derlenmiş bir dll'im var
bir fonksiyon var:

void __stdcall process_arr(double *in, double *out, int boyutu);

İşte Expert Advisor'daki o açıklama:
#import "some.dll"
void process_arr(double in[], double& out[], int boyut);

diziler aşağıda bildirilmiştir:

çift dizi1[100];
çift dizi2[100];

sonra ilk diziyi başlatırım ve ikisini de işleve geçiririm
proses_dizi(dizi1,dizi2,100);

her şey harika bir şekilde aktarılıyor, ancak olması gerektiği gibi geri dönmek istemiyor

fonksiyondan döndükten sonra test değerini gösteriyorum:
Yazdır(dizi2[1]);
ve günlükte bir giriş görünür
2005.09.19 18:30:03 EURUSD paritesi,H1: 2147483647
bozkırda değil, 2 ^ 31'in bununla ne ilgisi var ....
aynı şekilde dizinin diğer herhangi bir öğesiyle ortaya çıkar.
hata ayıklayıcı altında olmasına rağmen, fonksiyondan çıkmadan önce out dizisindeki değerler olması gerektiği gibi (fiyata yakın - ~1.2)
 
2147483647 sayısı sıfıra çok yakın görünüyor.
Daha doğrusu 2^31-1 ve sıfır gibi olmalıdır.
 
void __stdcall process_arr(çift *giriş, çift *çıkış, int boyutu);

İşte Expert Advisor'daki o açıklama:
#import "some.dll"
void process_arr(double in[], double& out[], int boyut);


Sadece bir tahmin (çünkü MQL'ye aşina değilim): ikinci parametre için & gerçekten gerekli mi?
void process_arr(double in[], double & out[], int boyut);
 
Rosh için bu doğru, ancak double türünden bahsediyoruz ve orada sayının temsili "biraz" farklı ve 2 ^ 31 0'dan oldukça uzak .... :(

Vick için, ve işareti bütün mesele, onun sayesinde dizinin içeriğini gerçekten değiştirebilirim ...
ikinci dizi - dönüş değerlerine sahip dizi
 
Vick için, ve işareti bütün mesele, onun sayesinde dizinin içeriğini gerçekten değiştirebilirim ...
ikinci dizi - dönüş değerlerine sahip dizi


Bu durumda, ve işaretinde öz yoktur (sadece kendim denedim) ve dizinin içeriğini başka bir şey sayesinde değiştirebilirsiniz :-). Örnekler dizininde DLL içeren bir örneğe baktınız mı? Orada her şey yolunda gidiyor. Analoji ile yapın.
 
çöp çıkıyor, bir tür double [] dizisiyle uğraşıyorsak, ve işareti hiç hava almıyor gibi görünüyor.
ama int[] ile her şey bir demet gibi çalışıyor, burada hala bir böcek gibi kokmaya başladığından şüphem var .... :(
Geliştiricilerin yorumlarını duymak isterim

bu davaya kaynak kodları verilmiş olsaydı, kimse kafasını kandıramazdı, ama bu yüzden ... lütfen yardım için başvuruyorum
Neden: