10分でできるMQL5用DLLの書き方、データのやりとり」についてのディスカッション。 - ページ 6

 
GarF1eld:
charの 代わりにwchar_tを 使用 する

問題は mql自体にある。

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

これはどんなコードなのでしょうか?ポインタのコピーは、アドレスの入った4バイトのメモリーをコピーするだけです。

この場合、あらかじめ(MQL5プログラム内で)受信ラインに必要なバッファを確保するように配慮すれば、memcpyが 役に立ちます。

 
stringo:

これはどんなコードなのでしょうか?ポインタのコピーは、アドレスの入った4バイトのメモリーをコピーするだけです。

このような場合、memcpyは、受信ライン(MQL5プログラム内)で必要なバッファの割り当てを行うようにすれば、役に立ちます。

ポインターがどうしたんだ?このコードは、mql4で完全に動作します。mql5への移行後ではありません。

みなさんがアドバイスしてくれていますが、mql5からdll関数に文字列を渡す方法について、本当に良い例を示してくれる人がいればいいのですが......。

 
antonix

...

質問

何が問題なのか?MQLからDLLに文字列を人力で渡すには?

1) メッセージをありがとうございました。このエラーは修正されました。更新をお待ちください。

2) wchar _t について正しく説明されています - MQL5 の文字列は Unicode です。

3) 「ビジュアルデバッグで確認する場合」とはどういう意味ですか?

4)これが正しい使い方です。

//--- нужно обеспечить буфер строки для заполнения его в 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);
  }
 

私のような苦労人のプログラマーを助けてくれてありがとうございます。:)あなたの例で、私の状況が少し明確になりました。

私は、文字列を wchar_tから古き良きcharに変換する関数を書くことにしました。この関数は、char型を使用するコードが多いプロジェクトでは、便利かもしれません。また、MQL5ではwchar_tしか渡さないので、DLLコードの半分を書き換えるより入力で変換する方が簡単です。

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

私のような苦労人プログラマーを助けてくれてありがとうございます。:)あなたの例で、私の状況が少し明確になりました。

私は、文字列をwchar_tから古き良きcharに変換する関数を書くことにしました。この関数は、char型を使用するコードが多いプロジェクトでは、便利な機能かもしれません。また、MQL5ではwchar_tしか渡さないので、DLLコードの半分を書き換えるより入力で変換する方が簡単です。

文字列をchar *として受け取るDLL関数は、もちろんchar型の配列の最初の要素へのポインタを受け取ります。つまり、このような関数のインポートをMQL5プログラムで記述する場合、文字列のパラメータとしてchar配列を使用する必要があります。

このような場合のために、各国のアルファベットの文字列を正しく変換するStringToCharArray 関数を用意しています。wcstombs関数は、常にこれを正しく行うわけではありません。

 

記事はおもしろく、役に立つ。

1)ソースコードが付属しているところがカッコいい。へー、でもコンパイルされたDLLはどこにあるんですか? 明らかにメガプロジェクターで作成しても問題ないでしょう。

でも、メガでもなくプロジェでもなかったらどうしよう! :)

2) MSコンパイラを使用している記事です。不親切ですね:) BC++は持っています。そのためにチューニングされたソースコードを掲載していただけませんか?

(IMHOでは、おそらく、MSとBCは常にソースを掲載したほうがいい、2つのリーディングカンパニーだが、書き方が違う)。

 

危険性のあるコード(DLL)は掲載しないようにし、ユーザーを不安にさせないようにしています。それに、これはあくまでテスト例です。

残念ながら、手元にボーランドC++コンパイラがない。自分で適応してみてください。1ページにも満たないコードです。

 

yu-sha:

開発者の目標が高すぎるのでは?

また、すべてが大昔にすでに行われていたこと(C、Delphi、...)であるのに、なぜ車輪を再発明するのでしょうか?

全く同感です。私としては、例えば、よく考えられたCOMインターフェースや、FXRobot Developer Studioに 向けた既存の開発戦略の枠組みの中で、少なくともDLLでMQL5コールバック関数へのポインタを渡すことができれば十分だと考えています。間違っているかも しれませんが、今のところ機能は社内用にしか書き出せないという印象です。開発環境としてのMTは、Borland Delphi(Embarcadero RAD Studio)やVisual Studioをはじめとする多くの開発環境の足元にも及ばないことを、地に足をつけて認識する必要があると思います。それは、開発者の才能ではなく、最新のIDEを開発するために必要な膨大なリソースのせいです。サードパーティベンダーによる上記プラットフォームの多大なサポートなどについては語らない。何よりもまず、完璧なユーザーインターフェース、標準的な機能、そしてユーザープログラムとサーバーの間のブリッジをMQLで実装し、MQLのプログラムがドライバーとして機能するように、開発者の努力を期待したい。誤解しないでいただきたいのは、初心者プログラマーの お気に入りのゲームを取り上げたいわけではないのですが、DIYのコンストラクターではなく、完璧なレディメイドのソリューションを手に入れたいプロのプログラマーやトレーダーには、もう少し注意を払うべきかと思われます。
 

人は、正しいと思われることをするのではなく、有益なことをしなければならない。なぜなら、収益性こそが正しいからです。そしてこの場合(MT5+MQL5+サービス)、MetaQuotesにとっては大きな利益(何十倍、何百倍にもなって返ってくる)、トレーダーにとっては大きな利益となるのです。ただ、すぐには無理です。

少なくとも5年先まで広く見渡すことができればいい。MetaQuotesはそれを実現しました。