Странный глюк с dll

 
Написал простенькую dll на Delphi, пробую подцепить.

Скрипт такой:

#import "Test.dll"
   int SaveStr(string s);
   string GetStr();
#import

void start()
{
   SaveStr(Symbol());
   MessageBox(GetStr());
}



Test.dll положил в папку C:\Program Files\MetaTrader 4

Запускаю скрипт, МТ падает с сообщением об ошибке и предложением ее отправить.
Решаю переименовать dll в 2Test.dll чтобы проверить реакцию МТ на отсутствие библиотеки.
Запускаю скрипт и получаю MessageBox с правильным именем символа!
Т.е. все сработало.
Делаю поиск по диску на Test.dll, нет таких ...
Переименовываю в 12Test.dll - работает, в 123Test.dll - работает, в Test.dll - падает.

Заметил особенность.
Для имени Test.dll МТ 2 раза задает вопрос "Разрешить вызов функции ...." и после этого падает.
Для других имен эти вопросы не задаются, но результат получается тот, который я хотел.

Получается что я вызываю недокументированную функцию GetStr() которая возвращает значение Symbol() ?

 
Ответа нет.
Видимо вопрос глупый :(
 
совершенно непонятна ситуация. не могли бы Вы прислать Вашу dll, если возможно, вместе с исходниками и проектом, для исследования ситуации на stringoATmetaquotesDOTru
 
Эта Dll'ка написана на Delphi,
она дома, вечером могу прислать.

Но мне кажется проблема в другом.
Если я правильно указываю имя 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()

 
в этом случае получается вот что: функция Symbol() кладёт в возвращаемое строковое значение название инструмента. функция GetStr(Symbol()) не может быть вызвана, о чём в логах эксперта есть запись ...

Похоже не так.
Если в SetString задать любой текст, но все равно возвращается имя тикера, а не то, что задали.

Подскажите что тут написано, если не сложно (это из вашего примера)
#pragma pack(pop)
//----
struct MqlStr
  {
   int               len;
   char             *string;
  };


Искать учедник по С в лом ..

Что означает #pragma pack(pop),
int в данном случае это 2-х байтовое или 4-х байтовое и
char *string; - это указатель на строку?

т.е. MqlStr состоит из 2-х полей, первое длина, второе указатель?

Хочу в delphi проверить, пока со строками не получается.

 
#pragma pack(pop)
означает восстановление выравнивания структур (у нас используется выравнивание на границу 8 байт)
тип данных int занимает 32 разряда, то есть 4 байта
член структуры len говорит о размере распределённой памяти для строки, на которую указывает член структуры *string
если len равно 0 при том, что string не равно 0, то это означает, что строка находится в так называемом пуле стрингов и её менять категорически нельзя
Причина обращения: