Bir dll'den bir işlevi içe aktarma sorununu anlamaya yardımcı olun

 

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.

 

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.

 
boysn >> :

#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.

 
Urain >> :

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.

 
Oluşturucudaki işlev bildirimlerine bakabilir misiniz? dize parametrelerini ona nasıl iletir ve sonucu aynı türde döndürürsünüz? Oluşturucunun dizelerle çalışırken bazı özellikleri vardır...
 
boysn >> :

{...} 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.

 
jartmailru >> :

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.

Genelde bir geliştirici üzerinde mt4 için dll yaptım, def dosyası kullanışlı değildi ...

 
boysn >> :

Sebep Linker ise, orada ne olabilir? Dosya çevrimdışı olacak şekilde yapıyor gibi görünüyor.


Proje ayarlarının Derleyici Bağlayıcı ve Paketler sekmelerinin ekran görüntüsünü alabilir misiniz?

 
alsu >> :

Genellikle debuilder üzerinde mt4 için dll yaptım, def dosyası kullanışlı değildi ...

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 :-).