Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1177

 
Alexey Viktorov:

А не пробовали строку подсунуть как #define str "длинная длинная строка" или даже как две строки через + или строковую функцию.

Ведь Comment тоже ограничен в длине строки, но переменными можно засунуть столько, что на мониторе не умещается в несколько строк.

Спасибо, действительно сокращение работает, компилятор действительно понимает,  но не принимает декорированных функций(кажется это так называется) с @. А старый компилятор принимает такие функции но не добавляет в import замены воспринимая буквально. Если же импортировать функции как в документации к dll т.е. "TRANS2QUIK_CONNECT", а не " _TRANS2QUIK_CONNECT@16",то она возвращает 2(TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND) . В чем разница не понимаю.
 
f1nik:
Спасибо, действительно сокращение работает, компилятор действительно понимает,  но не принимает декорированных функций(кажется это так называется) с @. А старый компилятор принимает такие функции но не добавляет в import замены воспринимая буквально. Если же импортировать функции как в документации к dll т.е. "TRANS2QUIK_CONNECT", а не " _TRANS2QUIK_CONNECT@16",то она возвращает 2(TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND) . В чем разница не понимаю.
Откройте файл длл в hex редакторе, там немного полистать и видны символически имена точек входа. Или найдите какой нибудь dll Explorer, который это сделает за вас, заодно выведит зависимости.

Не факт кстати что заработает, если точки входа не stdcall, то без прокладки не обойтись. 
 
f1nik:
Спасибо, действительно сокращение работает, компилятор действительно понимает,  но не принимает декорированных функций(кажется это так называется) с @. А старый компилятор принимает такие функции но не добавляет в import замены воспринимая буквально. Если же импортировать функции как в документации к dll т.е. "TRANS2QUIK_CONNECT", а не " _TRANS2QUIK_CONNECT@16",то она возвращает 2(TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND) . В чем разница не понимаю.

Я не знаю где в документации об этом написано, но перед спецсимволом в строке должен стоять слеш. Поэтому строка адреса, напримкр должра выглядеть так: С:\\папка\\файл

То-есть попробуйте записать так: "_TRANS2QUIK_CONNECT\@16"

А вообще, я с .dll не дружу. Так-что если не помогает, то …

 

@Maxim Kuznetsov Открывал dll в WinHex и Dependency Walker он выдает Ordinal, Hint, Function, Entry Point и именно он выдал имена функций типа (_TRANS2QUIK_CONNECT@16)  c ними старый компилятор работает и результат dll обратно выдает. Вы про эти символические имена?

@Alexey Viktorov Я сам профан в программировании,  но раньше скромных знаний хватало чтобы сделать мои задумки. Экранирование \\ не получается.

Нашел автоматический генератор proxy dll на python 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 это название функций которые будут из proxy dll видны. Поэтому я сократил до вида CONNECT. Dll собралась но терминал показывает TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND. Не для моих мозгов  это видимо. Надо будет руками проверить торговую систему, а там заказать dll.

 
f1nik:

@Maxim Kuznetsov Открывал dll в WinHex и Dependency Walker он выдает Ordinal, Hint, Function, Entry Point и именно он выдал имена функций типа (_TRANS2QUIK_CONNECT@16)  c ними старый компилятор работает и результат dll обратно выдает. Вы про эти символические имена?

@Alexey Viktorov Я сам профан в программировании,  но раньше скромных знаний хватало чтобы сделать мои задумки. Экранирование \\ не получается.

Нашел автоматический генератор proxy dll на python https://github.com/mavenlin/Dll_Wrapper_Gen . Думал что для меня по сути он подходит изменить только имена функций в собранной dll. Он собрал проект для visual studio. Пытался его собрать без изменений компилятор ругается на @  в именах функций.  Сгенерированный кусок cpp

 Кусок сгенерированного def файла

Я так понимаю что _TRANS2QUIK_CONNECT@16 _wrapper это название функций которые будут из proxy dll видны. Поэтому я сократил до вида CONNECT. Dll собралась но терминал показывает TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND. Не для моих мозгов  это видимо. Надо будет руками проверить торговую систему, а там заказать dll.

Вы за всё время не сказали ни слова о разрядности терминала и DLL. А это важно.

 

@Koldun Zloy Пробовал Trans2QuikAPI_1.2 она 32 битная с mt4 и quik 7, а также Trans2QuikAPI_1.3_x64 c 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), затем работают не декорированные, как минимум две. Спасибо всем откликнувшимся.
 
Как программно управлять скоростью тестирования на мт5? В справочнике четко не написано, что Sleep() низя в тестере использовать, но она вроде как не работает...
Нужно чтобы в определенный момент скорость тестирования уменьшалась. Вручную все такие моменты сложно подловить...
 
Здравствуйте! Я создал панель, которая состоит из фона и кнопок в MQL5. При перетаскивании панели, двигается только фон, а кнопки остаются на месте, и только на следующем тике кнопки перемещаются за фоном на нужное место. Подскажите пожалуйста, как сделать так, чтобы кнопки и фон перемещались одновременно. Заранее благодарю!
 
Mikhail:
Здравствуйте! Я создал панель, которая состоит из фона и кнопок в MQL5. При перетаскивании панели, двигается только фон, а кнопки остаются на месте, и только на следующем тике кнопки перемещаются за фоном на нужное место. Подскажите пожалуйста, как сделать так, чтобы кнопки и фон перемещались одновременно. Заранее благодарю!

речь про тестер или онлайн?

если онлайн - смотреть код, где то событие перемещения не проброшено нормально. Панелей кстати на сайте только библиотек пять разных, вы про какую? 

А в тестере - вроде бы никак, да и зачем.

Причина обращения: