Seçenek 1) def dosyasını nereye yapıştıracağınızı bulun. Onsuz, muhtemelen hiçbir yere varamazsınız.
Seçenek 2) Visual Studio'yu yükleyin
çok komik
seçenek 3:
En kötü ihtimalle VB Excel'den bile testçiler var - istenen işlevin çağrıldığını kontrol edin.
Değilse - bağlayıcı ayarları çarpık, evet - MQL açıklamasında bir hata değil
MT4 kurulumu iyi bir C-source DLL ile birlikte gelir - üzerinde pratik yapın, çok zaman kazanın.
#import "PExpDll.dll"
int GetIntValue(int);
double GetDoubleValue(double);
string GetStringValue(string);
#içe aktarmak
MQL-4'te işlevleri bildirme kurallarına göre, bariz bir hatanız var:
int GetIntValue ( int X ) ; double GetDoubleValue ( double X ) ; string GetStringValue ( string X ) ;
giriş parametresi adı yok, sadece yazın. MQL-4'te bu mümkün değildir.
MQL-4'te işlevleri bildirme kurallarına göre, bariz bir hatanız var:
giriş parametresi adı yoktur, yalnızca yazın. MQL-4'te bu mümkün değildir.
Derleyicinin yemin etmediği şey mümkündür.
Şöyle yazmaya çalıştım:
#import "timeService.dll" // функция, выдающее смещение от Utc // до времени сервера и до локального времени int timeService ( string , // <--- убрал имя переменной int & utcToServer [ ] , int & utcToLocal [ ] ) ; #import
Her şey harika çalışıyor.
Aslında, C ve C++ dillerinin kanunlarına göre, parametrelerin adlarını belirtmek tamamen isteğe bağlıdır -
dahası, çoğu durumda programcı oturup onlar hakkında yorum yapmakla meşguldür.
Tavsiyeniz için çok teşekkür ederim, cevabınız için teşekkür ederim.
1. MT4'te Service-Settings-Experts-Confirm dll fonksiyonlarını çağıran bir onay işaretim var. Bu nedenle, betiği çalıştırdığımda, böyle bir işlevi çağırıp çağırmayacağımı soruyor ...? "Evet"i seçiyorum ve hata şu: dll'den işlev çağırılamıyor (hata 127).
2. Double GetDoubleValue(double) türünde bir parametresi olmayan fonksiyon bildirimlerine gelince, örneklerde bu şekilde yazılmıştır, özellikle derleyici buna küfretmediği için bu normaldir.
3. Def dosyasına gelince... Tabii ki, belki ondan dolayı, ama nereye koyacağı tam olarak belli değil. C++Builder 6 ve 2009 projelerinde bu uzantıya sahip böyle dosyalar yoktur, yani. dll'nin kendisini monte ederken, onu yapıştıracak hiçbir yer yok gibi görünüyor. Aynı klasörde aynı isim altında \MetaTrader 4\experts\libraries klasöründe de doğru değil... Denedim... Kısacası belli değil. Hazır bir sistem dll'sinin kullanıldığı başka bir örnek denendi
#import "kernel32.dll"
int _lopen (dize yolu, int of);
int_lcreat(dize yolu, int öznitelik);
int_llseek(int tanıtıcı, int ofset, int orijin);
int _lread(int tanıtıcı, dize arabelleği, int bayt);
int_lwrite(int tanıtıcı, dize arabelleği, int bayt);
int _lclose(int tanıtıcı);
#içe aktarmak
Bu işlevlere denir.. DLLSample'ın nedeninin ne olduğu net değil
Sebep Linker ise, orada ne olabilir? Dosya çevrimdışı olacak şekilde yapıyor gibi görünüyor.
M..evet.. belli değil. MT4'teki örnek tam olarak çalışıyor mu? Çalıştığından emin olmak için test eden var mı?
Cevap veren ve verecek herkese teşekkürler.
{...} 3. Def dosyasına gelince... Elbette, belki bu yüzden, ama nereye koyacağı çok açık değil. C++Builder 6 ve 2009 projelerinde bu uzantıya sahip böyle dosyalar yoktur, yani. dll'nin kendisini monte ederken, onu yapıştıracak hiçbir yer yok gibi görünüyor. Aynı klasörde aynı isim altında \MetaTrader 4\experts\libraries klasöründe de doğru değil... Denedim... Kısacası belli değil. Hazır sistem dll'sinin kullanıldığı başka bir örnek denendi {...}
Bu işlevlere denir.. DLLSample'ın nedeninin ne olduğu net değil
Sebep Linker ise, orada ne olabilir? Dosya çevrimdışı olacak şekilde yapıyor gibi görünüyor.
M..evet.. belli değil. MT4'teki örnek tam olarak çalışıyor mu? Çalıştığından emin olmak için test eden var mı?
Cevap veren ve verecek olan herkese teşekkürler.
1) oluşturucunun ahem olmasına rağmen ... "biraz" yanlış, def dosyasına hala ihtiyaç var
2) Henüz Visual Studio'yu yüklemeyi denemediniz
3) çalışma örneği. inşa etme.
Bir meslektaşınızla bir örnek paylaşın :-).
Belki bir işlev bildirmeden önce bir tür dalgalı çizgi yazmanız gerekir.
.
Ve inşaatçı ... Hala ortalıkta 4 hizmet paketi bulunan altı paketin bir kopyası var.
Komik bir olaydan sonra kullanmayı bıraktım :-).
.cpp dosyasına bir işlev ekliyorum - yanıt olarak farklı hatalar başlıyor :-).
Hatalar, oluşturucunun yığın aracılığıyla işleve iletilen parametreler hakkında yalan söylemesiydi.
İşlevi silersiniz - her şey tekrar yolundadır.
Ayrıca sadece modülden erişilebilen global değişkenleri de geri çağırabilirsiniz,
ilan edildikleri ve çöplerin geri kalanından görülebildiği :-).
- Ü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
Dll'den işlevlerin nasıl içe aktarılacağını öğrenmek istiyorum. Farklı seçenekler denedim, ancak hata sürekli görünüyor: dll'den işlev çağırılamıyor (hata 127).
1. Projemi C++ Builder 6'da derlemeye çalıştım
2. C++Builder 2009'da aynı proje
3. C++ Builder 2009'daki DLLSample örneğinden bir proje oluşturuldu, derlendi
Her yerde aynı sonuç: dll'den işlev çağrılamaz (hata 127).
Doğrulama için, MetaTrader 4 ile birlikte gelen DLLSample örneğinden PExpDll.dll'nin C++ Builder 2009'da derlenmiş bir kitaplık olduğu bir komut dosyası kullanıyorum.
İşte komut dosyası:
#property telif hakkı "Telif hakkı © 2008, MetaQuotes Software Corp."
#özellik bağlantısı " https://www.metaquotes.net// "
#import "PExpDll.dll"
int GetIntValue(int);
double GetDoubleValue(double);
string GetStringValue(string);
#içe aktarmak
//+------------------------------------------- --------------------+
//| komut dosyası programı başlatma işlevi |
//+------------------------------------------- --------------------+
int başlangıç()
{
//----
Print("Komut dosyasını başlat");
GetStringValue("Bu işe yarayacak mı acaba?");
GetIntValue(10);
//----
dönüş(0);
}
//+------------------------------------------- --------------------+
Lütfen bana yardım edin, neyi yanlış yapıyorum ...
Şimdiden çok teşekkür ederim.