"10 dakikada MQL5 için DLL kütüphanesi nasıl yazılır ve veri alışverişi yapılır?" makalesinin tartışılması - sayfa 6

 
GarF1eld :
Kullanmak   char yerine wchar_t

wchar_t zaten geçti, yardımcı olmuyor. Sorun mql'nin kendisinde yatıyor.

 
_DLLAPI void __stdcall demo( char *stream, char *buf){ buf=stream;}

Bu kod nedir? Bir işaretçiyi kopyalamak, sadece adresi içeren 4 baytlık belleği kopyalamaktır.

Bu durumda, (MQL5 programında) gerekli arabelleği alıcı dizgede tahsis etmeye önceden dikkat ederseniz, memcpy size yardımcı olabilir.

 
stringo :

Bu kod nedir? Bir işaretçiyi kopyalamak, sadece adresi içeren 4 baytlık belleği kopyalamaktır.

Bu durumda, (MQL5 programında) alıcı dizgede gerekli arabelleği tahsis etmeye önceden dikkat ederseniz, memcpy size yardımcı olabilir.

Evet ve işte işaretçi. Bu kod mql4'te iyi çalışıyor. mql5'e geçişle değil.

Buradaki herkes tavsiye veriyor, ancak en az bir kişi mql5'ten bir dll işlevine bir dizenin nasıl geçirileceğine dair gerçekten çalışan bir örnek gösterdi?

 
:

...

Soru

Sorun nedir? MQL'den dll'ye bir dize insanca nasıl geçirilir?

1) Mesaj için teşekkürler. Hata düzeltildi. Güncellemeleri bekleyin.

2) Size wchar _t hakkında doğru bir şekilde bilgi verildi - MQL5'teki dizeler unicode'dur

3) "Görsel hata ayıklamayı kontrol ederken" ne anlama geliyor?

4) Şu şekilde doğru şekilde kullanın:

 //--- нужно обеспечить буфер строки для заполнения его в DLL
StringInit (b, 256 );
//--- вызываем DLL функцию
demo( "test" ,b);
//--- печатаем результат
Print (b);

//--- в DLL
_DLLAPI void __stdcall demo(wchar_t *stream, wchar_t *buf)
  {
   //--- проверим указатель
   if (stream==NULL || buf== NULL ) return ;
   //--- максимум 256 символов
   wcsncpy(buf,stream, 256 );
  }
 

Benim gibi sözde programcılara yardım ettiğiniz için teşekkür ederim. :) Örneğiniz durumuma biraz açıklık getirdi.

Canlandırdıktan sonra, bir dizgiyi wchar_t'den eski güzel karaktere dönüştürmek için bir işlev yazmaya (ve buna kimin ihtiyacı varsa) karar verdim. Bu fonksiyon, char tipini kullanan projelerde çok fazla koda sahip olanlar tarafından ihtiyaç duyulabilir. Ve MQL5 yalnızca wchar_t'yi geçtiğinden, girişte dönüştürmek, dll kodunun yarısını yeniden yazmaktan daha kolaydır.

 char * w2char( wchar_t * str){
       unsigned int lenght = wcslen(str)+ 1 ;
       char * ansi = new char [lenght];
      wcstombs(ansi, str, lenght);
       return ansi;
}
 
antonix :

Benim gibi sözde programcılara yardım ettiğiniz için teşekkür ederim. :) Örneğiniz durumuma biraz açıklık getirdi.

Canlandırdıktan sonra, bir dizgiyi wchar_t'den eski güzel karaktere dönüştürmek için bir işlev yazmaya (ve buna kimin ihtiyacı varsa) karar verdim. Bu fonksiyon, char tipini kullanan projelerde çok fazla koda sahip olanlar tarafından ihtiyaç duyulabilir. Ve MQL5 yalnızca wchar_t'yi geçtiğinden, girişte dönüştürmek, dll kodunun yarısını yeniden yazmaktan daha kolaydır.

Dizeleri char * olarak kabul eden DLL işlevleri, elbette, char dizisinin ilk öğesine bir işaretçi alır. Yani, bir MQL5 programında bu tür işlevlerin içe aktarımını tanımlarken, karakter dizisi parametresi olarak bir Char dizisi kullanılmalıdır.

Bu tür durumlar için, ulusal alfabedeki dizeleri doğru şekilde dönüştüren StringToCharArray işlevini sağladık. wcstombs işlevi bunu her zaman doğru şekilde yapmaz.

 

Makale ilginç ve kullanışlıdır.

1) Kaynak kodun eklenmiş olması harika. Heh, derlenmiş DLL nerede? Megaproger'ın onu yaratmasının bir sorun olmadığı açıktır.

Ve eğer Mega değilsem ve bir proger değilsem?! :)

2) Makale MS derleyicisini kullanır. Ve ben onunla arkadaş değilim. :) Bende BC++ var. Onun için keskinleştirilmiş kaynak kodlarını ortaya koymak mümkün mü?

(IMHO, MS ve BC için kaynak kodlarını her zaman yüklemek muhtemelen daha iyidir - bunlar önde gelen iki şirkettir, ancak kaynak kodlarını yazma stilleri farklıdır).

 

Kullanıcıları bir kez daha sinirlendirmemek için potansiyel olarak tehlikeli kod (DLL) yüklememeye çalışıyoruz. Ayrıca, bu sadece bir test durumudur.

Ne yazık ki, elimizde Borland C++ derleyicisi yok. Kendiniz uyarlamaya çalışın - birden fazla kod sayfası var.

 

yu-sha :

Geliştiriciler kendilerine çok mu yüksek hedefler belirliyor?

Ve her şey uzun zaman önce yapıldıysa (C, Delphi, ...) neden tekerleği yeniden icat edelim?

Kesinlikle katılıyorum. Benim için, örneğin, tam bir mutluluk için, iyi düşünülmüş bir COM arayüzü veya FXRobot Developer Studio'ya yönelik mevcut geliştirme stratejisi çerçevesinde ;-), en azından, bir işaretçi iletme olasılığı yeterli olacaktır. Bir DLL'de MQL5 Geri Arama işlevi. Belki yanılıyorum , ancak şimdilik işlevleri yalnızca dahili kullanım için dışa aktarabileceğiniz izlenimini edindim. Bana öyle geliyor ki, dünyaya inmemiz ve bir geliştirme ortamı olarak MT'nin asla Borland Delphi'ye ( Embarcadero RAD Studio ), Visual Studio'ya ve diğerlerine yaklaşamayacağını anlamamız gerekiyor. Ve bu, geliştiricilerin yeteneği değil, modern bir IDE geliştirmek için gereken devasa kaynaklardır. Bahsedilen platformların üçüncü taraf üreticilerin devasa desteğinden ve diğer şeylerden bahsetmiyorum. Her şeyden önce, geliştiricilerin mükemmel bir kullanıcı arayüzü oluşturma çabalarını, düzenli işlevsellik ve MQL programlarının bir sürücü olarak hareket edeceği kullanıcı programları ve sunucu arasında bir köprü kurmak için MQL kullanma becerisini görmek isterim. Beni yanlış anlamayın, acemi programcıların en sevdiği oyuncağını elimden almak istemiyorum, ancak mükemmel bir anahtar teslimi çözüm elde etmek isteyen profesyonel programcılara ve tüccarlara biraz daha dikkat etmemiz gerektiğini düşünüyorum. bir DIY kurucusu.
 

Doğru görüneni değil, kârlı olanı yapmalıyız. Çünkü karlılık doğru olandır. Ve bu durumda (MT5+MQL5+hizmetleri) MetaQuotes için çok büyük bir faydadır (onlarca veya yüzlerce kez karşılığını verecektir) ve tüccarlar için çok büyük bir faydadır. Sadece hemen değil.

Geniş bakmak ve en az 5 yıl ileriye bakmak her zaman iyidir. MetaQuotes yaptı.