Видимо вопрос глупый :(
она дома, вечером могу прислать.
Но мне кажется проблема в другом.
Если я правильно указываю имя Dll, то терминал падает, видимо у меня ошибка в передаче строковых параметров. Но если я указываю неверное имя Dll, то скрипт на MLQ ошибок что не найден файл не выдает но функции
int SaveStr(string s); string GetStr();
срабатывают.
Т.е. Dll тут вообще ни при чем и похоже вызываются встроенные в терминал функции.
Попробуйте просто запустить скрипт приведенный выше.
Он работает, проверил сейчас, безо всяких реальных Dll'лек.
Проверил, в вашем экзешнике нет такой функции,
есть только ссылка на GetStringTypeA,
а скрипт все равно работает ??
#import "123MT_test.dll" void _setInt(int K); int _getInt(); void _setDouble(double D); double _getDouble(); void _setString(string S); string _getString(); #import int start() { _setInt(123); _setDouble(3.14159265); _setString(Symbol()); MessageBox("K = " + _getInt() + "\nD = " + _getDouble() + "\nS = " + _getString(), "Test Dll"); return(0); }
тоже работает.
Имя dll не имеет значения.
Вместо целой и плавающей возвращает нули,
вместо строковой имя тикера.
int SaveStr(string s); string GetStr();
срабатывают.
Т.е. Dll тут вообще ни при чем и похоже вызываются встроенные в терминал функции.
Попробуйте просто запустить скрипт приведенный выше.
Он работает, проверил сейчас, безо всяких реальных Dll'лек.
в этом случае получается вот что: функция Symbol() кладёт в возвращаемое строковое значение название инструмента. функция GetStr(Symbol()) не может быть вызвана, о чём в логах эксперта есть запись
2005.02.16 15:24:46 testdll USDCHF,Daily: cannot load library 'Test.dll'
НО функция возвращает строку и отдаёт то, что было сложено туда ранее функцией Symbol()
Похоже не так.
Если в SetString задать любой текст, но все равно возвращается имя тикера, а не то, что задали.
Подскажите что тут написано, если не сложно (это из вашего примера)
#pragma pack(pop) //---- struct MqlStr { int len; char *string; };
Искать учедник по С в лом ..
Что означает #pragma pack(pop),
int в данном случае это 2-х байтовое или 4-х байтовое и
char *string; - это указатель на строку?
т.е. MqlStr состоит из 2-х полей, первое длина, второе указатель?
Хочу в delphi проверить, пока со строками не получается.
означает восстановление выравнивания структур (у нас используется выравнивание на границу 8 байт)
тип данных int занимает 32 разряда, то есть 4 байта
член структуры len говорит о размере распределённой памяти для строки, на которую указывает член структуры *string
если len равно 0 при том, что string не равно 0, то это означает, что строка находится в так называемом пуле стрингов и её менять категорически нельзя
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Скрипт такой:
Test.dll положил в папку C:\Program Files\MetaTrader 4
Запускаю скрипт, МТ падает с сообщением об ошибке и предложением ее отправить.
Решаю переименовать dll в 2Test.dll чтобы проверить реакцию МТ на отсутствие библиотеки.
Запускаю скрипт и получаю MessageBox с правильным именем символа!
Т.е. все сработало.
Делаю поиск по диску на Test.dll, нет таких ...
Переименовываю в 12Test.dll - работает, в 123Test.dll - работает, в Test.dll - падает.
Заметил особенность.
Для имени Test.dll МТ 2 раза задает вопрос "Разрешить вызов функции ...." и после этого падает.
Для других имен эти вопросы не задаются, но результат получается тот, который я хотел.
Получается что я вызываю недокументированную функцию GetStr() которая возвращает значение Symbol() ?