"Getting Rid of Self-Made DLLs" makalesi için tartışma

 

Yeni makale Getting Rid of Self-Made DLLs yayınlandı:

MQL5 dil işlevi, görevleri yerine getirmek için yeterli değilse, bir MQL5 programcısı ek araçlar kullanmak zorundadır. Başka bir programlama diline geçmeli ve bir ara DLL oluşturmalıdır. MQL5, çeşitli veri türlerini sunma ve bunları API'a aktarma olanağına sahiptir, ancak ne yazık ki, MQL5, kabul edilen işaretçiden veri ayıklama ile ilgili sorunu çözemez. Bu makalede, tüm "i"leri işaretleyeceğiz ve karmaşık veri türlerini değiştirmenin ve bunlarla çalışmanın basit mekanizmalarını göstereceğiz.

Diyagram 1'de, bazı veri türlerinin karşılaştırmalı boyutları gösterilmiştir.

MQL5'te çeşitli veri türlerinin boyutları


Verileri bir bellek alanından diğerine kopyalamak için Memcpy işlevi gereklidir.
Şekil 2'de, dört baytın kopyalanması gösterilmiştir.

Memcpy kullanarak 4 bayt kopyalama örneği

Yazar: ---

 
Makale için teşekkürler, soru: memcpy fonksiyonunu kullanırken, örnekte adresi int olarak yazdık, sistem x64 ise long değişken mi kullanmalıyız? Hangi sistem (x64, x86) olduğunu programatik olarak nasıl bulabiliriz? Teşekkürler.
 

long sorusu üzerine - yapabilirsiniz, ancak int'i bir karakter dizisinden böyle bir şeyin 4 baytlık alıcısı olarak kullanırsanız hiç gerekli değildir. (yani tam olarak & işaretçisi ile geçersiniz).

nasıl öğrenilir - burada yapabilirsiniz http://forum.ixbt.com/topic.cgi?id=26:37968

 
sergeev:

long sorusu üzerine - yapabilirsiniz, ancak int'i bir karakter dizisinden böyle bir şeyin 4 baytlık alıcısı olarak kullanırsanız hiç gerekli değildir. (yani tam olarak & işaretçisi ile geçersiniz).

Nasıl öğrenilir - burada http://forum.ixbt.com/topic.cgi?id=26:37968 olabilir

Bu yapıdaki değişim süresi hakkında bir şeyi açıklığa kavuşturabilir misiniz (örneğin, Int formatındaki 10 sayı için)?
 
shelandr:
Bu yapıdaki Değişim Zamanı hakkında bir şeyi açıklığa kavuşturabilir misiniz (örneğin, Int biçimindeki 10 sayı için)?

soruyu netleştirin.

memcpy hızı hakkında mı soruyorsunuz? Bence bu mql'den çok bir rüzgar kütüphanesinin çalışmasıyla ilgili yaratıcı bir soru.

 
Harici DLL API'leri ile çalışma konusunda çok faydalı ve bilgilendirici bir makale. Çok teşekkür ederim.
 

İyi günler. Makale nispeten uzun zaman önce yazılmış olmasına rağmen, kütüphane dll'leri ile veri alışverişi konusu hala geçerli. Ben de yakın zamanda belirli bir işlevselliği uygulama ihtiyacıyla karşı karşıya kaldım ve bir seçim yapmak zorunda kaldım: kendi dll'imi yazmak veya hala kütüphane dll'lerini kullanmaya çalışmak. İkincisi lehine bir seçim yaptım ve doğal olarak yapıları aktarmanın ve verileri geri almanın zorluğuyla karşılaştım. Bu makaleyi okuduktan sonra, bence çok karmaşık olan bazı noktaları tam olarak kavrayamadım. Bu makalede, bir yapıyı harici bir ortama aktarırken, kütüphane fonksiyonunun sonucu koyacağı ve daha sonraki çalışmalar için dönüştürmemiz gereken tahsis edilmiş bir bellek alanı olarak bir dizi kullanılması önerilmektedir. Bu alanda çok az deneyimim var ve belki de gerekçem amatörce görünecek, ancak yine de akıllı insanların beni düzelteceği umuduyla fikrimi ifade edeceğim. https://www.mql5.com/tr/articles/1543 adresindeki eski bir makalede bahsedilen basit bir örneği ele alalım.

Bu makale, kütüphane dll'leri aracılığıyla dosya arama konusunu ele almaktadır. Ayrıca, gerekli boyuttaki bir diziye bir işaretçi geçirmeyi ve daha sonra bu diziden gerekli verileri çıkarmayı önermektedir.

Özünde bir yapı nedir? Aynı bellek bölümüdür. Şimdi yapıları geçirme ve verileri alma yaklaşımını değiştirmeye çalışalım:

// Veri türü tanımlarını bildirme

#define  DWORD int
#define  TCHAR short // Unicode ile çalışacağımız için bu türü ayarlayın
#define  MAX_PATH (260)

// FILETIME yapısını deklare edin
struct FILETIME {
  DWORD dwLowDateTime;
  DWORD dwHighDateTime; 
};

// Arama sonuçlarının veri yapısını beyan edin
struct _WIN32_FIND_DATA {
  DWORD dwFileAttributes;
  FILETIME ftCreationTime;
  FILETIME ftLastAccessTime;
  FILETIME ftLastWriteTime;
  DWORD nFileSizeHigh;
  DWORD nFileSizeLow;
  DWORD dwReserved0;
  DWORD dwReserved1;
  TCHAR cFileName[MAX_PATH];
  TCHAR cAlternateFileName[14]; 
};

// Veri türlerini bildirerek WinAPI yapılarını hiçbir değişiklik yapmadan kopyalarız
// Kütüphane işlevini içe aktar
#import "kernel32.dll"
   int  FindFirstFileW(string path, _WIN32_FIND_DATA& answer);
#import 
//+------------------------------------------------------------------+
//| Uzman başlatma işlevi|
//+------------------------------------------------------------------+
int OnInit()
  {
// Önceden oluşturulmuş yapının türüyle bir değişken oluşturun 
   _WIN32_FIND_DATA data;
// Yapımıza ve aslında ayrılan belleğe bir işaretçi geçirerek kütüphane işlevini çağırın 
int handle = FindFirstFileW(TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Experts\\*.mq5", data);
   if(handle!=-1)
      {
        // Ek bir dönüştürme yapmadan yapımızın alanlarına erişerek arama sonucunu görüntüleyin 
Print("Dosya adı bulundu: ", ShortArrayToString(data.cFileName));   
         Print("Geçici olarak bulunan dosya adı: ", ShortArrayToString(data.cAlternateFileName));
         Print("Bulunan dosya boyutu: ", data.nFileSizeLow); 
      }
//---
   return(INIT_SUCCEEDED);
  }
//+-
Групповые файловые операции
Групповые файловые операции
  • 2008.07.15
  • MetaQuotes Software Corp.
  • www.mql5.com
Иногда требуется проделать одинаковые операции для некоторой группы файлов. Если у вас есть список файлов, входящих в эту группу, то это не проблема. Но если этот список нужно получить самостоятельно, то возникает вопрос: "Каким образом?" В статье предлагается сделать это с помощью функций FindFirstFile() и FindNextFile(), входящих в библиотеку kernel32.dll.
 
Алексей Барбашин: Ayrıca, gerekli boyuttaki bir diziye bir işaretçi aktarmak ve ardından gerekli verileri bu diziden çıkarmak için bir öneri de vardır. Ayrıca, gerekli boyutta bir diziye bir işaretçi geçirmeyi ve ardından gerekli verileri bu diziden çıkarmayı öneriyorlar.

Özünde bir yapı nedir? Aynı bellek bölümüdür. Şimdi yapıları geçirme ve veri alma yaklaşımını değiştirmeye çalışalım:

Kodunuzu editör üzerinden doğru bir şekilde yapıştırdım

 
Rashid Umarov:

Kodunuzu editör aracılığıyla doğru şekilde yapıştırdım


Çok teşekkürler! Kodu burada nasıl doğru biçimlendireceğimi henüz bulamadım. (((

 
Алексей Барбашин:

Çok teşekkür ederim! Burayı nasıl düzgün kodlayacağımı henüz çözemedim. (((


Kodnasıl eklenir.

 
Vladimir Karputov:

Kodnasıl eklenir.


Teşekkür ederim! Bunu araştıracağım! )))