Ticaret fırsatlarını kaçırıyorsunuz:
- Ücretsiz ticaret uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
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.
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:
3. MQL'de bildirilen int ve double değişkenlerini değiştirebilmek için diziler geçirilmelidir:
4. Dizeden bir dizi geçerken, MqlStr yapısı DLL'ye iletilir:
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.
İş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???
* ö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???
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;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;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.