MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1177

 
Alexey Viktorov:

文字列を#define str "longlong string"として、あるいは+やstring関数で2つの文字列としてスリップさせてみたことはありますか?

結局、Commentも文字列の長さには限界がありますが、変数は数行でモニターに収まらないほど突っ込めます。

コンパイラは@でデコードされた関数(確かそう呼ばれていた)を理解するのですが、受け付けないのです。そして、古いコンパイラは、そのような関数を受け入れるが、それを文字通りに受け取るインポート代入を追加しない。dllのドキュメントにあるように関数をインポートすると、例えば"_TRANS2QUIK_CONNECT@16 " の代わりに "TRANS2QUIK_CONNECT "とすると、2 (TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND) と返されます。その違いがわからない。
 
f1nik:
ありがとうございます。確かに短縮形は機能します。コンパイラは理解しますが、@でデコードされた関数(そう呼ばれるものだと思います)を受け入れません。そして、古いコンパイラはそのような関数を受け入れるが、それを文字通りに受け取るインポート置換を追加することはない。dllのドキュメントにあるように関数をインポートすると、例えば"_TRANS2QUIK_CONNECT@16 " の代わりに "TRANS2QUIK_CONNECT "とすると、2 (TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND) と返されます。その違いがわからない。
dllファイルを hexエディタで開き、少しブラウズすると、エントリポイントのシンボル名が表示されます。あるいは、この作業を代行し、同時に依存関係を表示してくれるDLLエクスプローラーもあります。

ちなみに、入力ポイントがstdcallでない場合、パディングがないとできないので、うまくいくかどうかはわかりません。
 
f1nik:
ありがとうございます、リダクションはうまくいきます、コンパイラは理解しますが、@でデコードされた関数(というのだと思います)を受け付けません。そして、古いコンパイラはそのような関数を受け入れるが、それを文字通りに受け取るインポート置換を追加しない。dllのドキュメントにあるように関数をインポートすると、例えば"_TRANS2QUIK_CONNECT@16 " の代わりに "TRANS2QUIK_CONNECT "とすると、2 (TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND) と返されます。その違いがわからない。

ドキュメントのどこに書いてあるのか分かりませんが、ワイルドカードの前にはスラッシュを付ける必要があります。したがって、アドレスラインは次のようになります: C:\folder</file

そこで、次のように書いてみてください。"_TRANS2QUIK_CONNECT@16"

実は、.dllはあまり得意ではありません。それでダメなら...

 

@Maxim Kuznetsov WinHexとDependency Walkerでdllを開くとOrdinal, Hint, Function, Entry Pointが生成され、それらを使って(_TRANS2QUIK_CONNECT@16) のように関数名を生成して、古いコンパイラは動作してdll結果を返します。これらの象徴的な名前のことでしょうか?

アレクセイ・ヴィクトロフ 私自身はプログラミングの専門家ではありませんが、私のささやかな知識で、私のアイデアを扱うには十分でした。Shielding \ is not work.

Pythonで自動プロキシDL生成ツールを発見 https://github.com/mavenlin/Dll_Wrapper_Gen .ビルドしたDLLは基本的に関数名だけを変更して動作すると思っていました。 変更せずにビルドしようとすると、コンパイラは関数名の@を悪者扱いします。 生成されたcppの一部です。

#include <windows.h>
#include <stdio.h>
HINSTANCE mHinst = 0, mHinstDLL = 0;
UINT_PTR mProcs[68] = {0};

LPCSTR mImportNames[] = {"_TRANS2QUIK_CONNECT@16"};
BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved ) {
        mHinst = hinstDLL;
        if ( fdwReason == DLL_PROCESS_ATTACH ) {
                mHinstDLL = LoadLibrary( "ori_TRANS2QUIK.dll" );
                if ( !mHinstDLL )
                        return ( FALSE );
                for ( int i = 0; i < 68; i++ )
                        mProcs[ i ] = (UINT_PTR)GetProcAddress( mHinstDLL, mImportNames[ i ] );
        } else if ( fdwReason == DLL_PROCESS_DETACH ) {
                FreeLibrary( mHinstDLL );
        }
        return ( TRUE );
}

extern "C" __declspec(naked) void __stdcall _TRANS2QUIK_CONNECT@16_wrapper(){__asm{jmp mProcs[0*4]}}

生成されたdefファイルの欠片

LIBRARY TRANS2QUIK.dll
EXPORTS
        _TRANS2QUIK_CONNECT@16=_TRANS2QUIK_CONNECT@16_wrapper @1

TRANS2QUIK_CONNECT@16 _wrapper は、プロキシDLLから見えるようになる関数名 と理解しています。 だからCONNECTに 切り替えた んです。dllはビルドされますが、ターミナルにTRANS2QUIK_TERMINAL_NOT_FOUNDと 表示されます。私の脳には合わないのでしょう。取引システムを手動で確認し、そこにdllを注文する必要があります。

 
f1nik:

@Maxim Kuznetsov WinHexとDependency Walkerでdllを開くとOrdinal, Hint, Function, Entry Pointが生成され、それらを使って(_TRANS2QUIK_CONNECT@16) のように関数名を生成して、古いコンパイラは動作してdll結果を返します。これらの象徴的な名前のことでしょうか?

アレクセイ・ヴィクトロフ 私自身はプログラミングの専門家ではありませんが、私のささやかな知識で、私のアイデアを扱うには十分でした。Shielding \ is not work.

Pythonで自動プロキシDL生成ツールを発見 https://github.com/mavenlin/Dll_Wrapper_Gen .アセンブルしたDLLの関数名だけを変更すれば、本質的にうまくいくと思った。ビジュアルスタジオ用のプロジェクトを構築しました。変更なしでビルドしようとしたところ、コンパイラが関数名の@を悪者にして、cppの断片が生成されました。

生成されたdefファイルの断片。

TRANS2QUIK_CONNECT@16 _wrapper は、プロキシDLLから見える関数の名前 だと理解しています。 だからCONNECTに 切り替えた んです。dllはビルドされますが、ターミナルにTRANS2QUIK_TERMINAL_NOT_FOUNDと 表示されます。私の脳には合わないのでしょう。取引システムを手動で確認し、そこにdllを注文する必要があります。

ターミナルやDLLのビット深度については一言も触れていませんね。そして、これは重要なことです。

 

Koldun Zloy Trans2QuikAPI_1.2 は mt4 と quik 7 で 32 bit、Trans2QuikAPI_1.3_x64 は mt5 と quik 8 で 64 bit のみみたいですね。Quik自体で外部トランザクションを有効にしています。インポートする機能が間違っているのではと思いました。自分で書いたんですよ。

int _TRANS2QUIK_CONNECT@16(string lpcstrConnectionParamsString, int& pnExtendedErrorCode[], string lpstrErrorMessage, int dwErrorMessageSize);
В новом компиляторе mt4 можно только так

int _TRANS2QUIK_CONNECT(string lpcstrConnectionParamsString, int& pnExtendedErrorCode[], string lpstrErrorMessage, int dwErrorMessageSize);
В h файле который есть в архиве с dll написано так long TRANS2QUIK_API __stdcall TRANS2QUIK_CONNECT (LPSTR lpstConnectionParamsString,long* pnExtendedErrorCode, LPSTR lpstrErrorMessage, DWORD dwErrorMessageSize);

等価なデータ型の種類。正しくなければ、昔のコンパイラーでは動かなかったと思います。

 
とにかく、DLLの接続は可能です。デコードされた関数を最初に呼び出すと(_TRANS2QUIK_CONNECT@16)、少なくとも2つのデコードされていない関数が動作する。回答してくれた皆さん、ありがとうございました。
 
mt5のテスト速度をプログラムで制御するにはどうしたらいいですか?テスターでSleep() が使えないことはマニュアルに明記されていないのですが、どうもうまくいかないようで...。
ある瞬間にテストのスピードを落とす必要があります。手作業では、そのような瞬間をすべて捉えることは難しいのですが......。
 
こんにちは!MQL5で背景とボタンで構成されるパネルを作りました。パネルをドラッグすると、背景だけが動いてボタンはその場にとどまり、次のティックで初めてボタンが背景の後ろに移動し、目的の場所に移動します。ボタンと背景を同時に動かすにはどうしたらよいか、アドバイスをお願いします。ありがとうございました。
 
Mikhail:
こんにちは!MQL5で背景とボタンで構成されるパネルを作成しました。パネルをドラッグすると、背景だけが動いてボタンはそのままで、次のティックで初めて背景の後ろに移動して目的の場所に表示されます。ボタンと背景を同時に動かすにはどうしたらよいか、アドバイスをお願いします。ありがとうございました。

は、テスターの話なのか、オンラインの話なのか?

オンラインの場合 - コードを見ると、どこかで移動イベントが正常にルーティングされていないことがあります。サイト上の方法によってパネルだけ5種類のライブラリ、あなたは何を意味するのでしょうか?

そしてテスターでは......方法はないようで、なぜか。