DLLに関する質問.......................... - ページ 6 1234567 新しいコメント 削除済み 2012.07.31 06:27 #51 ところで、http://www.parashift.com/c++-faq-lite/index.html は良いものですね。 削除済み 2012.08.01 08:39 #52 その問いは、今でも筆者に関係があるのだろうか。自分用にDLLを書いているので、少し例を挙げることができます。 Vladimir Pastushak 2012.08.01 15:32 #53 そうなんです!おかげさまでDLLの整理ができました。ありがとうございます。しかし、DLLの入れ方がわからないものがあります。 削除済み 2012.08.01 18:17 #54 関数は一定の規則に従って呼び出されます。-呼び出し規則。MT4は、__stdcall (ルールバリアントの特殊なケース)を遵守する関数での動作が保証されています。エクスポートした関数が 前述のルールを使用していることを確認するには、次のように記述します: void__stdcall AnyFn(); 2.ライブラリ関数のエクスポートには、__declspec(dllexport) を使う方法と、defファイルを使う方法があります(この方が簡単ですが、そうしないと関数のデコードに苦労することになります)。VSでdefファイルをプロジェクトに含めるには、まずプロジェクトファイルに追加し、次にファイル名を: project properties/composer/input/module definition fileに追加します。 P.S.: 例題プロジェクト with def file are located in: terminal directory expertssamples 103DLLSample. 削除済み 2012.08.01 18:17 #55 DLL関数にパラメータを渡す 1.文字列変数を渡す場合、char(ANSI文字、1バイトを取る)の配列をDLLに渡します。 #import "myLib.dll" void fn(string var); #import DLL: void __stdcall fn(char *pointer) {} 2.ライブラリにintやdoubleを渡すと、その変数がコピーされるため、DLLの変数を変更しても、DLLには変化がない。 #import "myLib.dll" void fn(int var); void fn(double var); #import DLL: void __stdcall fn(int var) {} 3.MQLで宣言されたintやdoubleの変数を変更できるようにするには、配列を渡す必要があります。 #import "myLib.dll" void fn(int var[]); void fn(double var[]); #import DLL: void __stdcall fn(int *var) {} void __stdcall fn(double *var) {} 4.文字列から配列を渡す場合、DLLには構造体MqlStrが渡されます。 МКЛ прототип: #import "myLib.dll" void fn(string var[]); #import DLL: struct MqlStr { int len; char *string; }; void __stdcall fn(MqlStr *var) {} 追伸 配列や文字列(ストリング)がDLLに渡される場合、実際には以下のようにメモリセクションへのポインタ(ポインタ)が渡されることになります。 void __stdcall fn(int *pointer) {} // このような感じです。こうすることで、例えばpointer[4]=4というように、配列として動作させることができるのです。 void __stdcall fn(int &reference) {} // またはそのようなもの。しかし、1つのアイテムにしかアクセスできない。 これは、1つのアイテムの配列をライブラリに渡すときに関係する。 Vladimir Pastushak 2012.08.03 05:57 #56 #import "myLib.dll" void fn(string var); #import DLL: void __stdcall fn(char *pointer) {} ポインターの 前にある*の適切な説明が見つからなかったのですが、何のためにあるのでしょうか?なくても大丈夫なのでは ? そして、DLLからテキストを取得する方法についての質問です。 Vladimir Gomonov 2012.08.03 06:10 #57 VOLDEMAR: ポインターの前にある*の適切な説明が見つからなかったのですが、何のためにあるのでしょうか? なくても大丈夫なのでは ? そして、DLLからテキストを取得する方法についての質問です。 そこからテキストを取得する必要はありません。 少なくとも今年はない。 削除済み 2012.08.03 06:53 #58 1.IDCに文字列を転送する。 DLL: #include <string.h> void __stdcall Temp(char *mqlStr) { size_t mqlStringSize = strlen(mqlStr); char stroka[] = "DLL string"; // Эту строку передадим в MQL. if(strlen(stroka) > mqlStringSize) stroka[mqlStringSize] = '\0'; // Добавляем нуль-терминатор (обозначает конец строки). strcpy(mqlStr, stroka); return; } MQL: #include "WaveCounter.dll" void Temp(string str); #include int start() { string str = "wwwwwsff"; // Задаем длину строки; Если длина будет меньше необходимого, то строка будет урезана. Temp(str); Alert(str); return; } 2.記号はポインタであることを示す。つまり、どんな変数も何らかの値を持っているだけでなく、それがメモリ上に位置するアドレスも持っているのです。ポインターはこのアドレスで動作することができます。これはよく理解されなければならない問題です、C++の本をチェックするべきだと思います。 Vladimir Pastushak 2012.08.03 08:01 #59 220Volt: 1.IDCに文字列を転送する。 2.記号はポインタであることを示す。つまり、どんな変数も何らかの値を持っているだけでなく、それがメモリ上に位置するアドレスも持っているのです。ポインターはこのアドレスで動作することができます。よく理解する必要がある問題なので、C++の本などを調べてみるとよいでしょう。 それが、私の仕事です。C++を使ったり、ビデオを見たり、本を読んだりしています。今、MKL 5の多くが明らかになりつつあります......。 削除済み 2012.08.03 09:32 #60 ただ、ライブラリのグローバルデータには注意が必要です。MCLプログラムは互いに独立して実行されます(ただし、同じスレッド内にあるためグローバル変数は 共有します)。したがって、複数のスクリプトが同じメモリ位置に書き込みと読み取りを行う可能性があります(これは良いことではありません)。そのためには、クリティカルセクションを使うなどして、同期をとる必要がある。これはグローバルデータ(関数の外で宣言されたもの)にも言えることだと強調しています。関数が呼び出されると、それ自身の独立した変数のセットが作成されます。 1234567 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
関数は一定の規則に従って呼び出されます。-呼び出し規則。MT4は、__stdcall (ルールバリアントの特殊なケース)を遵守する関数での動作が保証されています。エクスポートした関数が 前述のルールを使用していることを確認するには、次のように記述します: void__stdcall AnyFn();
2.ライブラリ関数のエクスポートには、__declspec(dllexport) を使う方法と、defファイルを使う方法があります(この方が簡単ですが、そうしないと関数のデコードに苦労することになります)。VSでdefファイルをプロジェクトに含めるには、まずプロジェクトファイルに追加し、次にファイル名を: project properties/composer/input/module definition fileに追加します。
P.S.: 例題プロジェクト with def file are located in: terminal directory expertssamples 103DLLSample.
DLL関数にパラメータを渡す
1.文字列変数を渡す場合、char(ANSI文字、1バイトを取る)の配列をDLLに渡します。
2.ライブラリにintやdoubleを渡すと、その変数がコピーされるため、DLLの変数を変更しても、DLLには変化がない。
3.MQLで宣言されたintやdoubleの変数を変更できるようにするには、配列を渡す必要があります。
4.文字列から配列を渡す場合、DLLには構造体MqlStrが渡されます。
追伸
配列や文字列(ストリング)がDLLに渡される場合、実際には以下のようにメモリセクションへのポインタ(ポインタ)が渡されることになります。
void __stdcall fn(int *pointer) {} // このような感じです。こうすることで、例えばpointer[4]=4というように、配列として動作させることができるのです。
void __stdcall fn(int &reference) {} // またはそのようなもの。しかし、1つのアイテムにしかアクセスできない。 これは、1つのアイテムの配列をライブラリに渡すときに関係する。
ポインターの 前にある*の適切な説明が見つからなかったのですが、何のためにあるのでしょうか?なくても大丈夫なのでは ?
そして、DLLからテキストを取得する方法についての質問です。
ポインターの前にある*の適切な説明が見つからなかったのですが、何のためにあるのでしょうか? なくても大丈夫なのでは ?
そして、DLLからテキストを取得する方法についての質問です。
1.IDCに文字列を転送する。
2.記号はポインタであることを示す。つまり、どんな変数も何らかの値を持っているだけでなく、それがメモリ上に位置するアドレスも持っているのです。ポインターはこのアドレスで動作することができます。これはよく理解されなければならない問題です、C++の本をチェックするべきだと思います。1.IDCに文字列を転送する。
2.記号はポインタであることを示す。つまり、どんな変数も何らかの値を持っているだけでなく、それがメモリ上に位置するアドレスも持っているのです。ポインターはこのアドレスで動作することができます。よく理解する必要がある問題なので、C++の本などを調べてみるとよいでしょう。ただ、ライブラリのグローバルデータには注意が必要です。MCLプログラムは互いに独立して実行されます(ただし、同じスレッド内にあるためグローバル変数は 共有します)。したがって、複数のスクリプトが同じメモリ位置に書き込みと読み取りを行う可能性があります(これは良いことではありません)。そのためには、クリティカルセクションを使うなどして、同期をとる必要がある。これはグローバルデータ(関数の外で宣言されたもの)にも言えることだと強調しています。関数が呼び出されると、それ自身の独立した変数のセットが作成されます。