#import "msvcrt.dll"int memcpy(int &dst, int &src[], int cnt);
int memcpy(int &dst[], int &src[], int cnt);
#import
voidOnStart() {
int Array[];
ArrayResize(Array, 1);
Array[0] = 123;
int Value = 0;
msvcrt::memcpy(Value, Array, sizeof(int));
Print(Value); // 123
}
関数への本当のポインターを得ることは可能だろうか。typedefを使って取得したポインタは、mqlプログラム内では完璧に動作する。しかし残念なことに、私はそれをdllに渡すことに失敗した。
C++とビルトイン・アセンブラの知識があり、スタックに何をどのように置くか知っていて、far callとnear callという用語が明確であれば、試すことができる。うまくいくとは保証できないが、可能性はある。
どこが間違いなんだ?
あなたのコードの例はまったく違います。私はアドレスから値を取得しようとしています。
記事の中に例があります。
あなたのコードの例はまったく違います。私はアドレスから値を取得しようとしています。
記事の中に例があります。
アドレスで書かれている箇所を強調しました。しかし、この記事の例もクラッシュを引き起こします。あなたが何を望んでいるかはすぐに理解できました。確かにWinAPI関数から返されたアドレスはMQL5では使えません。しかし、アドレスは正しく引数に渡されます。
引数で受け取ったアドレスを表示し、それを返す簡単なDLLを書けば絶対確実です。そしてその結果をMQL5で比較してください。ここでは多くの人がC言語を実践している。
間違いはどこだ?
修正しました:
どこでもLenghtは4以下であるべきです。
2GB以上のコピーはうまくいく
配列の開始アドレスの取得
あなたのコードの例はまったく違います。私はアドレスから値を取得しようとしています。
記事の中に例があります。
アドレスで書かれている箇所を強調しました。しかし、この記事の例もクラッシュを引き起こします。プロトタイプは4(32ビットアドレス、unsigned int)のもので、コンパイルや実行は5(64ビット)で行います。
WinAPIを使うなら、誰も信用できない。もしくは、自分でDLLを書いて、winapiを引かせ、mqlの2階でより高いレベルのインターフェイスを与える方がいい。
2GB以上のコピー
配列の先頭アドレスを取得する
64ビットのアドレスで失敗しました。しかし、修正したアドレスでもクラッシュします。本当に動作するのでしょうか?修正したfxsaberコードの完全な例を見ることはできますか?
WinAPIのアドレスはMQLと互換性がありません。
あなたのは直した:
プロトタイプは 4 (32 bit address a la unsigned int) で、コンパイル/実行は 5 (64 bit) です。
ありがとう。
最後のパラメータ(cnt)も64ビットです。size_t
https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/memcpy-wmemcpy