Fonksiyonun İçe Aktarımı (#import)

Fonksiyonlar, derlenmiş MQL5 modüllerinden (*.ex5 dosyaları) ve işletim sistemi modüllerinden (*.dll dosyaları) içe aktarılır. Modülün ismi #import direktifinde belirtilir. Derleyicinin, fonksiyon çağrısını ve aktarılan parametreleri doğru şekilde biçimlendirebilmesi için, fonksiyonların tam tarifi gereklidir. Fonksiyon tarifleri #import "modül ismi" direktifinin hemen ardından gelir. Yeni komut #import (parametresiz olabilir), içe aktarılan fonksiyonların tariflerinden oluşan bloğu tamamlar.

#import "file_name"
   fonk1 tanımla;
   fonk2 tanımla;
   ... 
   fonkN tanımla;
#import

İçe aktarılan fonksiyonlar herhangi bir isme sahip olabilir. Aynı isme ama farklı modüllere sahip iki fonksiyon aynı anda tanımlanabilir. İçe aktarılan fonksiyonların isimleri, gömülü fonksiyon isimleriyle aynı olabilir. Kapsam çözünürlüğü işlemi, hangi fonksiyonların çağrılması gerektiğini tanımlar.

#import anahtar sözcüğünden sonra belirlenen dosya arama emri İçe Aktarılan Fonksiyonların Çağrısı içinde tanımlanır.

İçe aktarılan fonksiyonlar derlenen modülün içinde olmadığından, derleyici geçirilen parametreleri doğrulayamaz. Bu yüzden, çalışma zamanı hatalarından kaçınmak amacıyla, içe aktarılan fonksiyona geçirilen parametrelerin düzeni ve sırası doğru tarif edilmelidir. İçe aktarılan (EX5'den veya DLL modülünden) fonksiyonlara geçirilen parametreler ön tanımlı değerlere sahip olabilirler.

İçe aktarılan fonksiyonlarda şunlar kullanılamaz:

Dizgiler veya herhangi tipli dinamik diziler içeren sınıflar, string tipi diziler veya karmaşık nesneler, DLL dosyasından içe aktarılan fonksiyonlara parametre olarak geçirilemezler

Örnekler:

#import "stdlib.ex5"
string ErrorDescription(int error_code);
int    RGB(int red_value,int green_value,int blue_value);
bool   CompareDoubles(double number1,double number2);
string DoubleToStrMorePrecision(double number,int precision);
string IntegerToHexString(int integer_number);
#import "ExpertSample.dll"
int    GetIntValue(int);
double GetDoubleValue(double);
string GetStringValue(string);
double GetArrayItemValue(double &arr[],int,int);
bool   SetArrayItemValue(double &arr[],int,int,double);
double GetRatesItemValue(double &rates[][6],int,int,int);
#import

MQL5 programının çalıştırılması sırasında fonksiyonların içe aktarımı için erken bağlama kullanılır. Yani kütüphaneler, programın ex5 uzantılı dosyası ile yüklenir.

Yüklenebilir modülünün bütünüyle belirtilmiş isminin (Sürücü:\Dizin\Dosyaismi.Uzn) kullanılması tavsiye edilmez. MQL5 kütüphaneleri terminal_konumu\MQL5\Libraries dosyasından yüklenir.

İçe aktarılan işlev 32 ve 64 bit Windows sürümleri için farklı çağrı sürümlerine sahipse, her ikisi de içe aktarılmalı ve _IsX64 değişkenini kullanarak doğru işlev sürümü açıkça çağrılmalıdır.

Örnek:

#import "user32.dll"
//--- 32-bit sistem için
int    MessageBoxW(uint hWnd,string lpText,string lpCaption,uint uType);
//--- 64-bit sistem için
int    MessageBoxW(ulong hWnd,string lpText,string lpCaption,uint uType);
#import
//+------------------------------------------------------------------+
//|  MessageBox_32_64_bit MessageBoxW()'un uygun sürümünü kullanır   |
//+------------------------------------------------------------------+
int MessageBox_32_64_bit()
  {
   int res=-1;
   //--- Eğer 64-bit Windows kullanıyorsak
   if(_IsX64)
     {
      ulong hwnd=0;
      res=MessageBoxW(hwnd,"64-bit MessageBoxW call example","MessageBoxW 64 bit",MB_OK|MB_ICONINFORMATION);
     }
   else  // 32-bit Windows kullanıyoruz.
     {
      uint hwnd=0;
      res=MessageBoxW(hwnd,"32-bit MessageBoxW call example","MessageBoxW 32 bit",MB_OK|MB_ICONINFORMATION);
     }
   return (res);
  }
//+------------------------------------------------------------------+
//| Script programı başlatma fonksiyonu
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int ans=MessageBox_32_64_bit();
   PrintFormat("MessageBox_32_64_bit returned %d",ans);
  }

.NET kütüphanelerinden fonksiyonları içe aktarma

.NET kütüphane fonksiyonlarıyla çalışmak için, belirli fonksiyonları tanımlamadan DLL'nin kendisini içe aktarmanız yeterlidir. MetaEditor, çalışabileceğiniz tüm fonksiyonları otomatik olarak içe aktarır:

  • Basit yapılar (POD, plain old data) - yalnızca basit veri tiplerini içeren yapılar.
  • Sadece basit tiplerin ve POD yapılarının veya dizilerinin kullanıldığı parametrelere sahip 'public static' fonksiyonlar.

Kütüphaneden fonksiyonları çağırmak için içe aktarmanız yeterlidir:

#import "TestLib.dll"
//+------------------------------------------------------------------+
//| Script programı başlatma fonksiyonu                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int x=41;
   TestClass::Inc(x);
   Print(x);
  }

TestClass sınıfının Inc fonksiyonunun C# kodu aşağıdaki gibidir:

public class TestClass
  {
   public static void Inc(ref int x)
     {
      x++;
     }
  }

Yürütme sonucunda, komut dosyası 42 değerini geri döndürür.

Ayrıca Bakınız

Dosya Ekleme