DLLに関する質問.......................... - ページ 6

 
ところで、http://www.parashift.com/c++-faq-lite/index.html は良いものですね。
 
その問いは、今でも筆者に関係があるのだろうか。自分用にDLLを書いているので、少し例を挙げることができます。
 
そうなんです!おかげさまでDLLの整理ができました。ありがとうございます。しかし、DLLの入れ方がわからないものがあります。
 

関数は一定の規則に従って呼び出されます。-呼び出し規則。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に渡します。

#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つのアイテムの配列をライブラリに渡すときに関係する。

 
#import "myLib.dll"

void fn(string var);

#import

DLL:

void __stdcall fn(char *pointer) {}

ポインターの 前にある*の適切な説明が見つからなかったのですが、何のためにあるのでしょうか?なくても大丈夫なのでは ?

そして、DLLからテキストを取得する方法についての質問です。

 
VOLDEMAR:

ポインターの前にある*の適切な説明が見つからなかったのですが、何のためにあるのでしょうか? なくても大丈夫なのでは ?

そして、DLLからテキストを取得する方法についての質問です。

そこからテキストを取得する必要はありません。 少なくとも今年はない。
 

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++の本をチェックするべきだと思います。
 
220Volt:

1.IDCに文字列を転送する。

2.記号はポインタであることを示す。つまり、どんな変数も何らかの値を持っているだけでなく、それがメモリ上に位置するアドレスも持っているのです。ポインターはこのアドレスで動作することができます。よく理解する必要がある問題なので、C++の本などを調べてみるとよいでしょう。
それが、私の仕事です。C++を使ったり、ビデオを見たり、本を読んだりしています。今、MKL 5の多くが明らかになりつつあります......。
 

ただ、ライブラリのグローバルデータには注意が必要です。MCLプログラムは互いに独立して実行されます(ただし、同じスレッド内にあるためグローバル変数は 共有します)。したがって、複数のスクリプトが同じメモリ位置に書き込みと読み取りを行う可能性があります(これは良いことではありません)。そのためには、クリティカルセクションを使うなどして、同期をとる必要がある。これはグローバルデータ(関数の外で宣言されたもの)にも言えることだと強調しています。関数が呼び出されると、それ自身の独立した変数のセットが作成されます。