DLL sorusu... - sayfa 6

 
 
Soru hala yazar için geçerli mi? Kendim için bir dll yazıyorum, küçük bir örnek çizebilirim.
 
Evet alakalı!!! Senin sayende dll'yi çözdüm! Teşekkür ederim ! Ama bir dll'ye nasıl koyacağımı çözemediğim şeyler var.
 

1. Fonksiyonlar belirli kurallara göre çağrılır - Çağrı kuralı. MT4'ün __stdcall'a (kuralların özel bir durumu) uyan işlevlerle çalışması garanti edilir. Dışa aktarılan işlevin yukarıdaki kuralları kullanmasını sağlamak için şöyle görünmelidir: void __stdcall AnyFn();

2. Bir kitaplık işlevini dışa aktarmaya zorlamanın iki yolunu biliyorum - __declspec(dllexport) kullanmak ve bir def dosyası kullanmak (bu daha kolaydır, aksi takdirde dekorasyon işlevleriyle de uğraşmak zorunda kalırsınız). VS'de, bir projeye bir def dosyası eklemek için önce proje dosyalarına ekleyin, ardından dosya adını şuraya ekleyin: proje özellikleri/bağlayıcı/giriş/modül tanım dosyası.

Not: Örnek proje def dosyası ile şurada bulunur: terminal dizini\uzmanlar\örnekler\DLLSample.

 

DLL FONKSİYONUNA GEÇEN PARAMETRELER

1. Bir dize değişkeni iletirken, DLL'ye bir karakter dizisi (ANSI karakteri, 1 bayt kaplar) iletilir.

 #import "myLib.dll"

void fn( string var);

#import

DLL:

void __stdcall fn( char *pointer) {}


2. Kütüphaneye int veya double iletmek, değişkenin kopyalanmasına yol açacaktır, bu nedenle, dll'deki değişkeni değiştirirken MCL'de bir değişiklik olmaz:

#import "myLib.dll"

void fn( int var );

void fn( double var );

#import

DLL:

void __stdcall fn( int var ) {}


3. MQL'de bildirilen int ve double değişkenlerini değiştirebilmek için diziler geçirilmelidir:

#import "myLib.dll"

void fn( int var []);

void fn( double var []);

#import

DLL:

void __stdcall fn( int * var ) {}

void __stdcall fn( double * var ) {}


4. Dizeden bir dizi geçerken, MqlStr yapısı DLL'ye iletilir:

МКЛ прототип:

#import "myLib.dll"

void fn( string var[]);

#import

DLL:
struct MqlStr
{
   int len;
   char * string ;
};

void __stdcall fn(MqlStr *var) {}


not

DLL'ye bir dizi veya dize (dize) geçirildiğinde, DLL'ye bir bellek alanına bir işaretçi (işaretçi) gönderilir, kitaplıkta bunu aşağıdaki gibi kabul ederiz:

void __stdcall fn(int *işaretçi) {} // yani. Böylece bir dizi gibi çalışabilirsiniz, örneğin pointer[4] = 4.

void __stdcall fn(int &reference) {} // ya da öylesine. Ancak yalnızca bir öğeye erişiyoruz. Bir öğe dizisini kitaplığa geçirirken gerçek.

 
#import "myLib.dll"

void fn( string var);

#import

DLL:

void __stdcall fn( char *pointer) {}

İşaretçiden önceki * işareti için mantıklı bir açıklama bulamadım, neden gerekli ??? Onsuz mümkün değil mi????

Ve dll gibi bir kursla ilgili bir soru metni almak için???

 
VOLDEMAR :

* öncesi işaretçisi için mantıklı bir açıklama bulunamadı, neden gerekli ??? Onsuz mümkün değil mi????

Ve dll gibi bir kursla ilgili bir soru metni almak için???

Ondan metin almamalısınız. En azından bu yıl.
 

1. Bir dizeyi MCL'ye aktarma:

DLL:
#include <string.h>
void __stdcall Temp( char *mqlStr)
{
   size_t mqlStringSize = strlen(mqlStr);
   char stroka[] = "DLL string" ;          // Эту строку передадим в MQL.
   if (strlen(stroka) > mqlStringSize)
      stroka[mqlStringSize] = '\0' ;       // Добавляем нуль-терминатор (обозначает конец строки) .
   strcpy(mqlStr, stroka);
   return ;
}

MQL:
#include "WaveCounter.dll"
void Temp( string str);
#include
int start()
{ 
   string str = "wwwwwsff" ;     // Задаем длину строки; Если длина будет меньше необходимого, то строка будет урезана.
   Temp(str); 
   Alert (str); 
   return ;
} 
2. * işareti bunun bir işaretçi olduğunu gösterir. Kısacası, herhangi bir değişkenin yalnızca bir değeri değil, aynı zamanda bellekte bulunduğu adresi de vardır. İşaretçiler bu adresle çalışabilir. Bu sorunun iyi anlaşılması gerekiyor, bence C++ ile ilgili kitaplara dikkat etmeye değer;
 
220Volt :

1. Bir dizeyi MCL'ye aktarma:

2. * işareti bunun bir işaretçi olduğunu gösterir. Kısacası, herhangi bir değişkenin yalnızca bir değeri değil, aynı zamanda bellekte bulunduğu adresi de vardır. İşaretçiler bu adresle çalışabilir. Bu sorunun iyi anlaşılması gerekiyor, bence C++ ile ilgili kitaplara dikkat etmeye değer;
evet, tam olarak bunu yapıyorum. C++ kullanıyorum, video izliyorum, kitap okuyorum. Şimdi bir çok MKL 5 netleşiyor .......
 

Sadece global kütüphane verilerine dikkat etmeniz gerekiyor. LCL programları birbirinden bağımsız olarak yürütülür (ancak ortak global değişkenleri vardır, çünkü bunlar aynı iş parçacığındadır), bu nedenle, birkaç komut dosyası aynı bellek alanına yazmaya ve okumaya başladığında (ki bu iyi değildir) bir durum mümkündür. . Burada, örneğin kritik bölümleri kullanarak senkronizasyon gereklidir. Bunun küresel verilerle ilgili olduğunu vurguluyorum (işlevlerin dışında bildirilen). Bir fonksiyon çağrıldığında, kendi bağımsız değişken seti oluşturulur.