MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 1177

 
Alexey Viktorov :

문자열을 #define str "long long string " 또는 + 또는 문자열 함수를 통해 두 개의 문자열로 밀어 넣는 대신.

결국 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) 를 반환합니다. 내가 이해하지 못하는 차이점은 무엇입니까?
16진법 편집기에서 dll 파일을 열고 조금 살펴보고 진입점의 이름을 상징적으로 보십시오. 또는 이 작업을 수행하는 동시에 종속성을 표시하는 일종의 dll 탐색기를 찾으십시오.

그건 그렇고, 그것이 작동한다는 사실은 아닙니다. 진입 점이 stdcall이 아니면 개스킷 없이는 할 수 없습니다.
 
f1nik :
감사합니다. 축소가 실제로 작동하고 컴파일러가 실제로 이해하지만 @가 포함된 데코레이팅된 함수(이를 호출한 것 같습니다)는 허용하지 않습니다. 그리고 이전 컴파일러는 이러한 함수를 허용하지만 가져오기에 대체를 추가하지 않고 그대로 받아들입니다. dll에 대한 문서에서와 같이 함수를 가져오는 경우, 즉 " _TRANS2QUIK_CONNECT@16" 이 아니라 "TRANS2QUIK_CONNECT" 이면 2(TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND) 를 반환합니다. 내가 이해하지 못하는 차이점은 무엇입니까?

문서의 어디에 이에 대해 기록되어 있는지 모르지만 문자열의 특수 문자 앞에 슬래시가 있어야 합니다. 따라서 주소 문자열은 예를 들어 다음과 같아야 합니다. С:\\folder\\file

즉, 다음과 같이 작성해 보십시오. " _TRANS2QUIK_CONNECT\@16"

일반적으로 저는 .dll과 친구가 아닙니다. 그래서 그게 안되면...

 

@Maxim Kuznetsov WinHex 및 Dependency Walker에서 dll을 열면 Ordinal, Hint, Function, Entry Point를 제공하며 ( _TRANS2QUIK_CONNECT@16)   이전 컴파일러는 그들과 함께 작동하고 결과 dll을 반환합니다. 이 상징적 인 이름에 대해 이야기하고 있습니까?

@Alexey Viktorov 나 자신도 프로그래밍의 평신도이지만 이전에는 적당한 지식만으로도 아이디어를 낼 수 있었습니다. \\ 이스케이프에 실패했습니다.

python https://github.com/mavenlin/Dll_Wrapper_Gen 에서 자동 프록시 dll 생성기를 찾았습니다. 사실 저에게는 조립된 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_QUIK_TERMINAL_NOT_FOUND가 표시됩니다. 제 뇌에는 안맞는 것 같습니다. 거래 시스템을 수동으로 확인한 다음 dll을 주문해야 합니다.

 
f1nik :

@Maxim Kuznetsov WinHex 및 Dependency Walker에서 dll을 열면 Ordinal, Hint, Function, Entry Point를 제공하며 ( _TRANS2QUIK_CONNECT@16)   이전 컴파일러는 그들과 함께 작동하고 결과 dll을 반환합니다. 이 상징적 인 이름에 대해 이야기하고 있습니까?

@Alexey Viktorov 나 자신도 프로그래밍의 평신도이지만 이전에는 적당한 지식만으로도 아이디어를 낼 수 있었습니다. \\ 이스케이프에 실패했습니다.

python https://github.com/mavenlin/Dll_Wrapper_Gen 에서 자동 프록시 dll 생성기를 찾았습니다. 사실 저에게는 조립된 dll에서 함수명만 바꾸는게 맞다고 생각했습니다. 그는 비주얼 스튜디오를 위한 프로젝트를 만들었습니다. 변경하지 않고 컴파일하려고했는데 컴파일러는 함수 이름에서 @를 맹세합니다. 생성된 cpp 조각

생성된 def 파일의 조각

_TRANS2QUIK_CONNECT@ 16 _wrapper가 프록시 dll에서 볼 수 있는 함수의 이름이라는 것을 이해합니다. 그래서 CONNECT로 줄였습니다. DLL이 빌드되었지만 터미널에 TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND가 표시됩니다. 제 뇌에는 안맞는 것 같습니다. 거래 시스템을 수동으로 확인한 다음 dll을 주문해야 합니다.

당신은 지금까지 터미널과 DLL의 비트에 대해 한 마디도 말하지 않았습니다. 그리고 그것이 중요합니까?

 

@Koldun Zloy 는 32비트(mt4 및 quik 7 포함)와 Trans2QuikAPI_1.3_x64(mt5 및 quik 8 포함)를 시도했는데 64비트와 비슷합니다. 빠른 자체에서 외부 거래를 활성화했습니다. 기능을 제대로 가져오지 못하고 있다고 생각했습니다. 직접 작성

 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 )를 처음 호출하면 장식되지 않은 두 개 이상의 함수가 작동합니다. 응답해주신 모든 분들께 감사드립니다.
 
MT5에서 테스트 속도를 프로그래밍 방식으로 제어하는 방법은 무엇입니까? 설명서에는 테스터에서 Sleep() 을 사용하지 말라고 명확하게 명시되어 있지는 않지만 작동하지 않는 것 같습니다...
특정 순간에 테스트 속도가 감소해야 합니다. 그 모든 순간을 손으로 잡기가 힘들다...
 
안녕하세요! MQL5에서 배경과 버튼으로 구성된 패널을 만들었습니다 . 패널을 드래그하면 배경만 이동하고 버튼은 제자리에 유지되며 다음 틱에서만 버튼이 배경 뒤에서 올바른 위치로 이동합니다. 버튼과 배경을 동시에 움직이는 방법을 알려주세요. 미리 감사합니다!
 
Mikhail :
안녕하세요! MQL5에서 배경과 버튼으로 구성된 패널을 만들었습니다. 패널을 드래그하면 배경만 이동하고 버튼은 제자리에 유지되며 다음 틱에서만 버튼이 배경 뒤에서 올바른 위치로 이동합니다. 버튼과 배경을 동시에 움직이는 방법을 알려주세요. 미리 감사합니다!

테스터를 말하는 건가요 아니면 온라인을 말하는 건가요?

온라인인 경우 - 이동 이벤트가 정상적으로 전달되지 않는 코드를 확인합니다. 그건 그렇고, 사이트에는 5개의 다른 라이브러리만 있습니다. 무슨 말씀이십니까?

그리고 테스터에서 - 그것은 전혀 그렇지 않은 것 같습니다. 그리고 그 이유는 무엇입니까?