MetaTrader 4 için bir API fonksiyonları kütüphanesi geliştirildi - sayfa 7

 
İyi günler, bu yüzden tanıdık bir programcıya danıştım ve bana bu DLL'nin özellikle Omega'da kullanım için yazılmamışsa, işlevsellik garantisinin olamayacağını söyledi. Çünkü Omega, DLL işlev çağrısı parametrelerinde ihtiyaç duyulan kaynaklara sahip olmayabilir. bir örnek vereceğim:
int TikKot(char *kotx, double *teklif, double *ask, TDateTime *tim);
bu satırda "TDateTime *tim" gibi veriler Omega tarafından desteklenmez.
Yani, şu ana kadar yalnızca terminalin başlangıç ve bitiş işlevleri, parametrelerin ayarlanmadığı yerlerde çalışır. Parametrelerin ayarlandığı yerde DLL'nin hangi parametreleri kabul ettiğini bilmeniz gerekir, örnekler olması güzel olurdu.
Sanırım bir programcı ile Delphi ile ilgili bir örneğe bakmam gerekecek, orada tam olarak neyin gerekli olduğunu söyleyebilecek ve sonra DLL'ye gerekli parametreleri sağlamak için Omega araçlarını arayacak. Özellikle Omega için bir DLL sürümü yayınlamak isteseydiniz, bu onun hızlı test edilmesini ve kullanımını ölçülemeyecek kadar kolaylaştırır, bence Omega'ya sahip çok sayıda kullanıcı olacaktır. Zaten ilgilenenler var. Help Omega'dan küçük bir alıntı ekliyorum:
Önemli bir nokta, desteklenen veri türlerinin listesidir, aşağıya bakın.



DLL İşlev Tanımı

Bir EasyLanguage DLL işlevini çağırmadan önce DLL'yi DLL İşlev Bildirimi deyimini kullanarak bildirmelisiniz.

Sözdizimi:

DefineDLLFunc: "DLLNAME.DLL", Dönüş Tipi, "FunctionName", Parametreler;

DLLNAME.DLL - işlevin bulunduğu DLL'nin adı, Dönüş Türü - işlevin döndüreceği ifadenin türü, İşlevAdı - DLL'de tanımlandığı şekliyle işlevin adı, Parametreler - işlev tarafından beklenen parametrelerin listesi ( virgülle ayrılmış her parametre).

32 bit DLL'lerin _cdecl, stdcall veya fastcall kullanarak büyük/küçük harfe duyarlı dışa aktarılan bildirilmiş işlevleri kullandığını hatırlamak çok önemlidir. DLL'lerin EasyLanguage ile uyumlu olması için, dışa aktarılan işlevler büyük harfler kullanılarak oluşturulmalı ve _stdcall olarak bildirilmelidir. Dışa aktarılan bu işlevler, DLL dosyasının İHRACAT .DEF bölümünde listelenmelidir. İşlev prototipinden "_declspec(dllexport)" öğesinin kullanılması, EasyLanguage'ın dışa aktarılan DLL işlevlerini bulması için yeterli değildir.

Örneğin, aşağıdaki ifade, USER32.DLL adlı bir DLL'de bulunan MessageBeep adlı bir işlevi bildirir. Bir boole (doğru/yanlış) değeri döndürür ve bir parametre, bir int bekler.

DefineDLLFunc: "USER32.DLL", bool, "MessageBeep", int;

Veri tipleri

EasyLanguage, DLL'lerde bulunan işlevlere bilgi göndermek ve almak için kullanılabilecek çeşitli geçerli veri türlerini destekler. EasyLanguage tarafından desteklenen veri türlerinin listesi aşağıdadır:

Temel veri türleri:

BAYT
1 bayt tamsayı veri türü.

karakter
1 bayt tamsayı veri türü.

int
4 bayt imzalı tamsayı veri türü.

KELİME
2 bayt işaretsiz tamsayı veri türü.

uzun
4 bayt imzalı tamsayı veri türü.

DWORD
4 bayt işaretsiz tamsayı veri türü.

batmadan yüzmek
4 bayt kayan nokta veri türü.

çift
8 bayt kayan nokta veri türü.

BOOL
4 bayt boole veri türü.




Seçenekler:


İMZASIZ UZUN
DWORD ile aynı.

GEÇERSİZ
"Döndürülen değer yok" anlamına gelir.

İşaretçi türleri:


LPBYTE
Bir BYTE'ye işaretçi.

LPINT
Bir int için işaretçi.

LPWORD
Bir WORD işaretçisi.

uzun
LONG için işaretçi.

LPDWORD
Bir DWORD'a işaretçi.

LPFLOAT
Bir kayan noktanın işaretçisi (FAR kayanlığında).

LPDOUBLE
Çifte işaretçi (çift FAR'da).

LPSTR
Bir karaktere işaretçi.


Tüm işaretçiler 32 bit işaretçilerdir ve EasyLanguage bunların her birine aynı şekilde davranır.

Ayrıca, tamsayı olan Açık, Yüksek, Düşük ve Kapat hariç, EasyLanguage'daki tüm değerlerin yüzer olduğunu hatırlamak çok önemlidir. Bu fiyatları manipüle etmek için fonksiyona çizilen sembolün fiyat ölçeğini göndermelisiniz.

Örneğin, bir kağıt 1/1000 fiyat skalasına sahipse ve nihai fiyat 105.125 ise, bu fiyat DLL'ye 105125 olarak gönderilecektir. DLL'nin bu fiyatı nasıl okuyacağını bilmesi için, içindeki değeri göndermeniz gerekir. Bu durumda değeri döndüren PriceScale ayrılmış sözcüğü 1000'dir.
 
Omega, DLL işlev çağrısı parametrelerinde gerekli olan kaynaklara sahip olmayabilir. bir örnek vereceğim:
int TikKot(char *kotx, double *teklif, double *ask, TDateTime *tim);
bu satırda "TDateTime *tim" gibi veriler Omega tarafından desteklenmez.

Şimdi her şey açık. Bu soruna geçici bir çözüm bulmak için Omega'da TDateTime yerine double belirtmeyi deneyin - yani. int TikKot(char, double, double, double);
Aslında, bu türler kolayca değiştirilebilir ve her biri 8 bayt bellek kullanır. İyi şanlar!
 
Peki teşekkür ederim. Peki ya "char" türü, Omega Sayısal gerektirir ve DLL'nin metne ihtiyacı var mı? Değiştirilebilir mi?
 
Peki teşekkür ederim. Peki ya "char" türü, Omega Sayısal gerektirir ve DLL'nin metne ihtiyacı var mı? Değiştirilebilir mi?

Niye ya? Sonuçta, açıklama diyor ki:
LPSTR
Bir karaktere işaretçi.

Bu aynısı. Omega belgelerinde bu tür değişkenler için örnekler var mı? Oradaki benzer seçeneklere dikkatlice bakmanız gerekiyor. İyi şanlar!
 
Merhaba, sorunu buldum:
İşte DLL'yi çağırmayla ilgili yardımdan:

Not: 32 bit DLL'ler, _cdecl, _stdcall veya fastcall kullanılarak bildirilen, büyük/küçük harfe duyarlı dışa aktarılan işlevleri kullanır. DLL'lerin EasyLanguage ile uyumlu olması için, dışa aktarılan işlevlerin tümü büyük harfler kullanılarak oluşturulmalı ve _stdcall olarak bildirilmelidir. Dışa aktarılan bu işlevler, DLL'nin .DEF dosyasının İHRACATLAR bölümünde listelenmelidir. EasyLanguage'ın bir DLL'nin dışa aktarılan işlevlerini bulması için işlevin prototipinden "_declspec (dllexport)" kullanmak yeterli değildir.

Yani burada Omega'nın yalnızca BÜYÜK HARFLERLE yazılan İşlevlerle çalıştığı yazıyor. Başka bir DLL'de nasıl yazıldığını kontrol ettim, gerçekten sadece BÜYÜK HARFLERLE.
İşlevlerin çağrısını değiştirirseniz (adlar büyük harflerle), daha fazla test edebilirsiniz.
Şahsen ben ürününüzle çok ilgileniyorum ve sizden ricam DLL'yi Omega'ya uyarlamanız. Umarım işe yarar ... başarı!
Daha sonra buraya yazmak istemiyorsanız lütfen, başka bir ticaret otomasyonu çözümü üzerinde çalışmam gerekecek. Teşekkür ederim.
 

İşlevlerin çağrısını değiştirirseniz (adlar büyük harflerle), daha fazla test edebilirsiniz.
Şahsen ben ürününüzle çok ilgileniyorum ve sizden ricam DLL'yi Omega'ya uyarlamanız. Umarım işe yarar ... başarı!

Fonksiyonların büyük harfli bir versiyonunu yaptım ve posta kutunuza gönderdim. İyi şanlar!
 
Çok teşekkürler deneyip sonucu yazarım.
Neden: