#import "kernel32.dll"int GetModuleHandleA (string lpModuleName);//возвращает хэндл процесса; если lpModuleName=NULL то - текущего#importstring lpModuleName;// неинициализированная строка содержит только /0, т.е. NULLint hInstance;// передадим в CreateWindowExA
hInstance=GetModuleHandleA(lpModuleName);// аналогично GetModuleHandleA(NULL)
うまくいきそうだな...。以下は、インジケーターのコードです。
#import "kernel32.dll"//в комментариях типы данных в С++ :int GetModuleHandleA (string lpModuleName);//LPCSTR, т.е. LP (указатель) на строку (STR) с завершающим /0, которая является константой (C). Имя модуля, возм. с path//на выходе HMODULE (целое без знака, 4 байта). Дескриптор приложения (процесса)int GetModuleFileNameA(int hModule,//HMODULE (целое без знака, 4 байта). Он же.int& lpFileName[],//LPSTR, т.е. LP (указатель) на строку (STR) с завершающим /0. Это выходной параметр - pathint nSize);//DWORD (целое, 4 знака). Расчётная длина буфера.//на выходе DWORD (целое, 4 знака). Длина строки с path#import#property indicator_chart_windowexternstring lpModuleName;//Path. Сейчас там '/0', то есть GetModuleHandleA возвращает дескриптор текущего управляющего процесса. Path задавать не через '/', a '\'. string path="";//инициализация пустой строкойint lpFileName[64];//через string задать не получается. Почему не разобрался. 64 это 0х100/4 байта (длина int)=0х40=64.int hModule;//для выхода функции GetModuleHandleA, т.е. дескриптора процессаint nSize=255;//не 256, потому что последний 256-й символ по идее будет 0х00 = '/0' (максимальная длина строки)int sizeFileName;// так обзовём выходной параметр с GetModuleFileNameAint i;//счётчик циклаint start()
{
hModule = GetModuleHandleA(lpModuleName);
sizeFileName = GetModuleFileNameA(hModule, lpFileName, nSize);
for (i=0; i<sizeFileName; i++){//конвертация int[] в string
path=path//конкатенация с проходом от 0 до sizeFileName-1, на каждом проходе обрабатываем по одному каждый байт:
+ CharToStr(lpFileName[i] & 255)//битовое and, обнуление старших разрядов. Н-р, 0xkkllmmnn&0x000000FF(т.е.255)=0x000000nn, т.к. x&0=0, x&1=x (0xFF=0b11111111)
+ CharToStr(lpFileName[i] >> 8 & 255)//сдвиг вправо на 1 байт (8 бит), потом обнуление старших разрядов. На выходе, как и в предыдущей строке, 1 (один) байт
+ CharToStr(lpFileName[i] >> 16 & 255)//сдвиг вправо на 2 байта (16 бит), чтобы получить третий в int байт, и обнуление старших разрядов.
+ CharToStr(lpFileName[i] >> 24 & 255)// аналогично: на 3 байта (24 бит), четвёртый байт. Параллельно везде конвертация в string.
;
}
Print("hmodule = ", hModule, ", sizeFileName = ", sizeFileName, ", path = ", path);//в журнал.
path="";//обнуляем строку на выходе, чтобы не было дальнейшей конкатенации по циклу
return(0);
}
エラー処理は試されましたか?
いや、そんなことをして何になる?どうせなら、もう一回クエリーをやってくれ。
なぜデータがないのか、もしかしたらクエリーを繰り返しても無意味なのかもしれません。
いや、そんなことをして何になる?いずれにせよ、もう1度クエリを実行する必要があります
念のため、聞いておこう。MQL4仕様について質問です。MSDNドキュメントによると、呼び出された関数がそのパラメータにポインタを持つ場合、MQL4ではパラメータの参照渡しを 使うことができますよね?
少なくともC++では
他の通貨やタイムフレームのどのようなデータが必要ですか?標準またはカスタムのインジケーター、価格、何か他のもの。成功しないコードの部分を教えてください。
実は、OHLC以外は必要ないんです。そして、それはコードのことではありません。チャートを開くと、仮想メモリ上に時系列が作成され、受信したすべての相場は履歴ファイルに書き込まれることなくメインメモリに保存されます。履歴ファイルは、MT4を閉じたときのみ書き込まれます。対応するチャートを開かずにデータを要求した場合、時系列は作成されませんが、ダウンロードしたデータは直接履歴ファイルに書き込まれます。このデータを取得するためには、再度問い合わせを行う必要があり、この場合にのみ、(ファイルからの)新しいデータを取得することができます。ファイルからではなく、RAMからデータを取得するために、何らかの方法でオープンチャートの存在をシミュレートしてみたかったのです。
正直なところ、私はそうしたプロセスを深く掘り下げたことがないんです。どんな作業に必要なんでしょうね。
gyfto:
これで良いのでしょうか?
うまくいきそうだな...。以下は、インジケーターのコードです。
ツールの初期パラメータに、アプリケーションのパスの代わりに「empty」を指定すると、出力時にそのハンドルとフルパスが(ログとして)返されます。そして...
合っているような気がするのですが・・・。以下は、インジケーターのコードです。
インジケーターの初期パラメーターには、アプリケーションのパスの代わりに「empty」が指定されており、出力では、そのハンドルとフルパスが(ログに)返されます。次は...
なぜ、1行目は文字列バッファを 使用し、2行目は整数配列を使用しているのですか?
どちらの場合でも、初期化された文字列を使用することを妨げるものは何ですか?そうすれば、コードを十数行削減することができます。
Zhunko:
どちらの場合でも、初期化された文字列を使用することを妨げるものは何ですか?
ログによると、dll 'kernel32.dll'からの関数 'GetModuleFileNameA' の呼び出しが、7C902128 で文字列宣言の場合に重大なエラー c0000005 を発生しました。今でもその理由がわからない。表面的には、端末が開いてから3-7秒後にクラッシュし、ログに何かを書き込む時間がない、つまり、端末が勝手に閉じてしまう。