Скачать MetaTrader 5

Передача массива string в dll по ссылке

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Интересуют возможности MetaTrader 5? Загляни и узнай!
Alexander
1512
Alexander 2010.03.07 15:59 

Пытался так 

// ---------------------------------------------------------------
_DLLAPI void __stdcall PassStringArray1(wchar_t** arr, int size)
{
        for (int i = 0; i < size; i++)
                arr[i] = L"Hello!";
}

// ---------------------------------------------------------------
_DLLAPI void __stdcall PassStringArray2(wchar_t** arr, int size)
{
        for (int i = 0; i < size; i++)
                wcsncpy(arr[i], L"Hello!", 32);
}

// ---------------------------------------------------------------
_DLLAPI void __stdcall PassStringArray3(wchar_t** arr, int size)
{
        for (int i = 0; i < size; i++)
                memcpy(arr[i], L"Hello!", 32);
}

 И в mql5

   string arr[10];
   for(int i = 0; i < 10; i++)
      StringInit(arr[i], 32);
      
   PassStringArray1(arr, 10);
   for(int i = 0; i < 10; i++)
      Print("PassStringArray1: ", arr[i]);

   PassStringArray2(arr, 10);
   for(int i = 0; i < 10; i++)
      Print("PassStringArray2: ", arr[i]);

   PassStringArray3(arr, 10);
   for(int i = 0; i < 10; i++)
      Print("PassStringArray3: ", arr[i]);

 Ни один вариант не работает. Пробовал делать аналог MqlStr для мт5 - та же самая ситуация. Везде выскакивает Access violation excetion.

Как передавать массивы строк по ссылке в dll? 

MetaQuotes
Админ
24951
Renat Fatkhullin 2010.03.07 18:58  

Вы в пустой стринг пытаетесь данные прописать? Нужно предварительно память выделить.

Кстати, написание C++ кода в стиле "не буду проверять на нуль ни единой ссылки" приводит к закономерному результату - access violation. Посмотрите на примеры из статьи про DLL - там все параметры перепроверяются.


Alexander
1512
Alexander 2010.03.07 21:15  
Renat:

Вы в пустой стринг пытаетесь данные прописать? Нужно предварительно память выделить.

Кстати, написание C++ кода в стиле "не буду проверять на нуль ни единой ссылки" приводит к закономерному результату - access violation. Посмотрите на примеры из статьи про DLL - там все параметры перепроверяются.


выделить память где? "сверху"? Разве StringInit не этим занимается?

Замечание по NULL учел, спасибо.

 

И еще вопрос: если я выделил под строку 64 символа, а в dll оказалось, что нужно больше, я могу расширить этот запас из dll, скажем так, до 128 символов?

Ilyas
1205
Ilyas 2010.03.08 13:11  
GarF1eld:

выделить память где? "сверху"? Разве StringInit не этим занимается?

Замечание по NULL учел, спасибо.

 

И еще вопрос: если я выделил под строку 64 символа, а в dll оказалось, что нужно больше, я могу расширить этот запас из dll, скажем так, до 128 символов?

Нет, управлять памятью из DLL к сожалению никак.
Alexander
1512
Alexander 2010.03.08 19:15  
mql5:
Нет, управлять памятью из DLL к сожалению никак.
В любом случае прошу вас скинуть пример работы с массивом string. Потому что я уже несколько дней не могу ничего сделать :)
Alexander
1512
Alexander 2010.03.09 17:14  

Немного изменил код

_DLLAPI void __stdcall PassStringArray2(wchar_t** arr, int size)
{
        if (arr == NULL) MessageBox(NULL, L"arr == NULL", L"", 0);
        
        for (int i = 0; i < size; i++)
        {
                if (arr[i] == NULL) MessageBox(NULL, L"arr[i] == NULL", L"", 0);
                wcsncpy(arr[i], L"Hello!", 32);
        }
}

Ни один MessageBox не выскакивает. Значит все ссылки рабочие. 

Но все равно получаю исключение. В Mql выделяю память через StringInit . Может по другому как-то нужно? Уже прововал в стринги пробелы загонять. Не помогло.

Если сам создаю двумерный массив wchar_t и вписываю в него данные указанными выше способами, то все работает. А из mql если передавать, то вылетает. У меня не тот опыт программирования на c++, чтобы разобраться в чем дело.

Импортирую так:

   void PassStringArray2(string& arr[], int size);

 Может мне помогут?

 

Ilyas
1205
Ilyas 2010.03.09 17:35  
GarF1eld:

Немного изменил код

Ни один MessageBox не выскакивает. Значит все ссылки рабочие. 

Но все равно получаю исключение. В Mql выделяю память через StringInit . Может по другому как-то нужно? Уже прововал в стринги пробелы загонять. Не помогло.

Если сам создаю двумерный массив wchar_t и вписываю в него данные указанными выше способами, то все работает. А из mql если передавать, то вылетает. У меня не тот опыт программирования на c++, чтобы разобраться в чем дело.

Импортирую так:

 Может мне помогут?

 

То, что вы смогли передасть массив строк в функцию dll мой недостмотр.
Механизм передачи массива строк в функции dll пока ещё вошёл в билд беты.

В любом случае советую изменить  алгоритм и использовать какой-то другой
механизм взамодействия, ибо передача массива строк операция ужасно дорогая. 

Alexander
1512
Alexander 2010.03.09 17:49  
mql5:

В любом случае советую изменить  алгоритм и использовать какой-то другой 

механизм взамодействия, ибо передача массива строк операция ужасно дорогая. 

Понимаю, просто хотел за раз получить 100 строк чем 100 раз по строке :)

Спасибо за ответ, теперь спокоен 

Alexander
1512
Alexander 2010.04.08 05:39  
mql5:

механизм взамодействия, ибо передача массива строк операция ужасно дорогая. 

Уже вошел? можно пробовать?
Serge
457
Serge 2010.12.02 16:03  
mql5:

Механизм передачи массива строк в функции dll пока ещё вошёл в билд беты.

Так всё же как передавать массив строк в длл по ссылке или посоветуйте эфективную альтернативу.
Ilyas
1205
Ilyas 2010.12.02 16:35  
К сожалению, от передачи массива строк в сторонние библиотеки пришлось отказаться из-за безопасности.
Как вариант могу предложить использовать сложение элементов строк через разделитель и передачу этой суммы строк в библиотеку.

P.S.: Если не секрет, напишите, зачем Вам понадобилось передавать массив строк?

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий