Dllから関数を呼び出して結果を返す - ページ 6

 
そのf1-forum
マイク=テラニン=私 :)エミュレータもアルパリのフォーラムで既にお渡ししていますしね。MTSは、あなたが私のエミュレータ上でそれらの多くがクラッシュしたかを知っていた場合、私はあまり興味がありません...。:)
 
2マイク
:))そう思ったんです。ご興味のある方は、こちらで私のシステムをご覧ください。
http://forum.alpari-idc.ru/viewtopic.php?t=45555
もちろん、ごちゃごちゃしていますが...。
なんなら、エミュレーターでお世話になったので、システムを説明しますよ。
 
OK、共有したい場合は、murdoc (at) newmail.ruに連絡してください。テスターで動かしてみて、結果をお知らせします。
 
Renat:<br / translate="no"> デフォルトでは、DLL からのインポートは完全に禁止されています。これがプロテクトです。
外部DLLを使用する場合は、「各DLL関数呼び出しを確認する」ボタンを有効にし、そこで何が呼び出されるかを確認すればよい。これは保護でもある。また、/historyと/filesディレクトリへのアクセスのみで、すべての埋め込みファイル操作の保護が可能です。

もし、ある人がExpert AdvisorをDLLで公開したら、ユーザーはそのDLLを信用するかしないか、どちらかになります。信頼できないならダウンロードしないし、信頼できるなら「DLL関数のインポートを 許可する」にチェックを入れないと、エキスパートが動作しないのだそうです。呼び出している関数の名前もExpert Advisorには役に立ちません。なぜなら、関数が何を行っているかを知るためには、DLLを分解する必要があり、誰もがこれを行えるわけではないからです。そしてこのDLLでは、いろいろと厄介なことができるのですが、MT端末ではそれを防ぐことができないのです。ですから、「保護」というのは非常に相対的なもので、この文脈では本当の保護とは言えません。これがマイクの言いたかったことだと思います。

MT 4 Expert AdvisorsでユーザーDLLから関数を呼び出せるようにしたのは、MT 3にあったAPIの置き換えと位置付けています。つまり、APIが削除された理由の1つである、MT 4端末をデータフィードに変換して注文する機会があるのです(フォーラムでの様々なトピックから判断して)。しかし、APIは残ったまま、非常に不快で、多くのユーザーがそれについて話し、それは冗談から状況を思い出させる: "....飽きられればいい」。そして、このトピックはそのことの確認でもあるのです。筆者の質問に対して、具体的で有益な回答は得られていない。これらの質問は私にも関連するもので、答えはさらに関連するものです :-)。
私もプログラマーとしての経験は浅いのですが、現在のExpert Advisor<->DLLのシステムでは、定義上、シンプルで美しい解答を得ることはできないのです。正確には、MQL4の範囲内では美しいソリューションかもしれませんが、MT4ターミナルとカスタムソフトの統合の範囲内では、控えめに言っても何の意味もないのです。もっと機能的なソリューションもありますから、それを探せばいいだけです:-)。例えば、mtapi.dllのような関数を持つDLLを作成しても、ディーリングセンターのサーバーとではなく、クライアント端末とやり取りすることになる。この場合、開発者の利益は守られ(MT4ターミナルがなければDLLは動作しません)、MQL4 Expert Advisorsよりも複雑なものを作成できる人は、独自のソフトウェア(独自のGUIを含む)を取引システムに統合する良い 機会を得ることができるのです。もし、そのようなバリエーションが検討され、議論されているのであれば、リンクを教えてください(私はそのようなバリエーションには出会っていません)。もしそうでないなら、この件に関する開発者の意見を知りたい。

P.S. 取引端末の説明にある「クライアントAPIの利用が可能」という一行がとても魅力的です。それがMetaTraderに惹かれた理由ですが、ターミナルのバージョン4でAPIがないことにとてもがっかりしました。開発者側とAPI利用者側の歩み寄りを期待します。現状(ekpertsからDLL関数を呼び出す)では不満がある。
 
問題にぶつかったのは、もちろん私が遅すぎて、うまくいかなかったのかもしれませんが......。

VC++用にコンパイルされたDLLがあります。
機能があります。

void __stdcall process_arr(double *in, double *out, int size);

Expert Advisorにそのような宣言があります。
#import "some.dll"
void process_arr(double in[], double& out[], int size);

配列は次に宣言されます。

double arr1[100];
double arr2[100];

を作成し,最初の配列を初期化した後,その両方を関数
process_arr(arr1,arr2,100)。

すべてのものが渡されるが、関数はそれを返すことを拒否する。

関数から戻った後、テスト値を出力しています。
Print(arr2[1])する。
と表示され、ログに以下のエントリーが表示されます。
2005.09.19 18:30:03 arrtest EURUSD,H1: 2147483647
ということではなく、2^31......がどう関係するのか?
は,配列の 他のどの要素に対しても同じように動作します.
関数を終了する前にデバッガで確認したところ、out 配列の値はあるべき値 (価格に近い値 - ~1.2) になっていました。
 
2147483647という数字は、ゼロに非常に近いらしい。
正確には2^31-1、つまりゼロのようなものであるはずです。
 
void __stdcall process_arr(double *in, double *out, int size); <br / translate="no">。
以下はExpert Advisorでの宣言です。
#import "some.dll"
void process_arr(double in[], double& out[], int size);


MQLに詳しくないので)提案なのですが、2番目のパラメータに&は本当に必要なのでしょうか?
void process_arr(double in[], double& out[], int size);
 
に、Roshさん、それはそうなんですが、double型の 話をしていて、そこでは数値表現が「微妙に」違っていて、2^31は0からかなり離れている...ということです。:(

VicKの場合、アンパサンドがポイントになります。
2番目の配列は、戻り値の配列です。
 
VicKの場合、アンパサンドがポイントになります。<br / translate="no"> 2番目の配列は、戻り値の配列です。


この場合、アンパサンドに本質はなく(自分で試しただけですが)、他のもののおかげで配列の中身を変更することができます :-)。ディレクトリ内のDLLサンプルはご覧になりましたか?そこではすべてがうまく機能しています。同じようにやってください。
 
double[]型の 配列を扱う場合、アンパサンドは何の違いもないようです。
しかし、int[]ではすべて正常に動作しています。 ここからバグの臭いがしてきたような気がします...。:(
開発者のコメントを知りたい

これがソースコード付きなら誰も困らないが...どうぞ、助けを求めているんです。