"10 dakikada MQL5 için DLL kütüphanesi nasıl yazılır ve veri alışverişi yapılır?" makalesinin tartışılması - sayfa 10

 

Evet, işin aslı şu ki script az önce çöktü, bundan sonra hata kodunu nasıl izleyebilirim? Veya bir sonraki başlangıçta hemen okunabilir mi?

Prensip olarak, dll'nin 64x altında derlenmesiyle sorun çözüldü. Doğru, sonra başka hatalar ortaya çıkmaya başladı, ancak bu artık önemli değil, genel olarak c/c++ kütüphanelerini nasıl oluşturacağımı ve mql5'e nasıl bağlayacağımı anlamam gerekiyordu. Örneğiniz şimdi iyi çalışıyor.

 
Makale güncellenecek mi? Dll ile çalışırken herhangi bir değişiklik oldu mu?
 

Studio 2017'ye sahipseniz, eski stüdyo için bu talimata bakıyor ve ne ve nasıl yapacağınızı birleştirmiyorsanız, o zaman ilk önce bu makaleyi okumanızı tavsiye ederim: https://docs.microsoft.com/ru-ru/ cpp/build/walk-through-a-dinamik-bağlantı-kütüphane-cpp oluşturma-ve-kullanma?view=vs-2017

Ardından, yukarıdaki makaledeki örnekteki resim ve benzerlikte dll'nizi zaten oluşturup bir istemci uygulamasında test ettiğinizde, bu talimatı 2. noktadan başlayarak "kelimeleri ile okuyun ve bir MQL5 programında anlatılmaktadır. ve şöyle denir:". Yani dll'nizi orada yazıldığı gibi mt5'te bildirin.

Bu şekilde sorunumu çözdüm.

 

C++ ve MQL arasındaki tür ilişkilerinin makro biçiminde bir listesini istiyorum.

 #define MQL_STRING wchar_t
 
@Renat Fatkhullin , DLL'de dizi ve dize yeniden boyutlandırma konusunda bir örneğe ihtiyacınız var. Bunu realloc () aracılığıyla yapmak veya aktarılan verileri serbest bırakmamak, ancak işaretçiyi yeni bir veri dizisine değiştirmek mümkün mü?
 

İşte benim Visual Studio 2012 c++ kodum. cpp uzantılı (main.ssr)

 #define MT4_EXPFUNC __declspec(dllexport) создал макрос чтобы не писать запись __declspec(dllexport) int __stdcall add( int a= 0 , int b= 0 )
//__declspec(dllexport)int __stdcall add(int a=0, int b=0)и так пробовал тоже
MT4_EXPFUNC int __cdecl add( int a= 0 , int b= 0 ) //stdcall данная примитивная функция ничего не делает а просто возвращает значение 18
{ return ( 18 );пробовал так return 18 ;}

Daha sonra, dışa aktarılan işlevlerin bir listesini içeren def (main.def) ana uzantısına sahip bir dosya oluşturdum , kod şöyle görünüyor:

LIBRARY "dllmt42"
EXPORTS
add

Ardından, derleyici bir içe aktarma yaptı

 #import "dllmt42.dll"
int _add( int a= 0 , int b= 0 );
#import

Derlemede herhangi bir sorun yok, ancak danışmanı grafiğe bıraktığınızda bir hata çıkıyor.

çözümlenmemiş içe aktarma işlevi çağrısı, 'dllmt42.dll' içinde '_add' öğesini bulun. Total Commander, bir dosyayı sürüklerken işlevi derleyicinin kendisi olarak görür

Kim yardımcı olabilir, bir hatayla sorunu nasıl çözebilir, işlevlerin doğru dışa aktarılmasından sorumlu olan ve depolayan .def uzantılı bir dosya nasıl olabilir?


 
Seric29 :

İşte benim Visual Studio 2012 c++ kodum. cpp uzantılı (main.ssr)

Ardından, dışa aktarılan işlevlerin bir listesini içeren def (main.def) ana uzantılı bir dosya oluşturdum , kod şöyle görünüyor:

Ardından, derleyici bir içe aktarma yaptı

Derlemede herhangi bir sorun yok, ancak danışmanı grafiğe bıraktığınızda bir hata çıkıyor.

çözümlenmemiş içe aktarma işlevi çağrısı, 'dllmt42.dll' içinde '_add' öğesini bulun. Total Commander, bir dosyayı sürüklerken işlevi derleyicinin kendisi olarak görür

Kim yardımcı olabilir, bir hatayla sorunu nasıl çözebilir, işlevlerin doğru dışa aktarılmasından sorumlu olan ve depolayan .def uzantılı bir dosya nasıl olabilir?


C++ olduğundan, dışa aktarılan işlevlerin hem bildirimlerine hem de uygulamalarına extern "C" eklenmelidir. Aksi takdirde, girdilerin imzaları "olumlu" olur ve MT (herkes gibi) onları görmez.

 
Maxim Kuznetsov :

C++ olduğundan, dışa aktarılan işlevlerin hem bildirimlerine hem de uygulamalarına extern "C" eklenmelidir. Aksi takdirde, girdilerin imzaları "olumlu" olur ve MT (herkes gibi) onları görmez.

iyi ben böyle yazdım

 #define MT4_EXPFUNC extern "C" __declspec(dllexport)
//__declspec(dllexport)int __stdcall add(int a=0, int b=0)
MT4_EXPFUNC int __cdecl add( int a= 0 , int b= 0 ) //stdcall
{
     return ( 18 );
}

Ve yine aynı - çözülmemiş içe aktarma işlevi çağrısı, 'dllmt42.dll' içinde '_add' öğesini bulun. . Onlar. ++ olmadan saf C'ye mi ihtiyacınız var?

 
.def dosyası hiç gerekli değildir. MQL'de #import bölümündeki işlevleri çoğaltmak gerekiyor
 
Roffild :
.def dosyası hiç gerekli değildir. MQL'de #import bölümündeki işlevleri çoğaltmak gerekiyor

Evet, ve onsuz, gördüm ve benim için çalışmıyor, peki, bana orada neyi çoğaltacağımı göster, bana zaten doğru yolda rehberlik et?