Вы в пустой стринг пытаетесь данные прописать? Нужно предварительно память выделить.
Кстати, написание C++ кода в стиле "не буду проверять на нуль ни единой ссылки" приводит к закономерному результату - access violation. Посмотрите на примеры из статьи про DLL - там все параметры перепроверяются.
Вы в пустой стринг пытаетесь данные прописать? Нужно предварительно память выделить.
Кстати, написание C++ кода в стиле "не буду проверять на нуль ни единой ссылки" приводит к закономерному результату - access violation. Посмотрите на примеры из статьи про DLL - там все параметры перепроверяются.
выделить память где? "сверху"? Разве StringInit не этим занимается?
Замечание по NULL учел, спасибо.
И еще вопрос: если я выделил под строку 64 символа, а в dll оказалось, что нужно больше, я могу расширить этот запас из dll, скажем так, до 128 символов?
выделить память где? "сверху"? Разве StringInit не этим занимается?
Замечание по NULL учел, спасибо.
И еще вопрос: если я выделил под строку 64 символа, а в dll оказалось, что нужно больше, я могу расширить этот запас из dll, скажем так, до 128 символов?
Нет, управлять памятью из DLL к сожалению никак.
Немного изменил код
_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);
Может мне помогут?
Немного изменил код
Ни один MessageBox не выскакивает. Значит все ссылки рабочие.
Но все равно получаю исключение. В Mql выделяю память через StringInit . Может по другому как-то нужно? Уже прововал в стринги пробелы загонять. Не помогло.
Если сам создаю двумерный массив wchar_t и вписываю в него данные указанными выше способами, то все работает. А из mql если передавать, то вылетает. У меня не тот опыт программирования на c++, чтобы разобраться в чем дело.
Импортирую так:
Может мне помогут?
То, что вы смогли передасть массив строк в функцию dll мой недостмотр.
Механизм передачи массива строк в функции dll пока ещё вошёл в билд беты.
В любом случае советую изменить алгоритм и использовать какой-то другой
механизм взамодействия, ибо передача массива строк операция ужасно дорогая.
В любом случае советую изменить алгоритм и использовать какой-то другой
механизм взамодействия, ибо передача массива строк операция ужасно дорогая.
Понимаю, просто хотел за раз получить 100 строк чем 100 раз по строке :)
Спасибо за ответ, теперь спокоен
механизм взамодействия, ибо передача массива строк операция ужасно дорогая.
Механизм передачи массива строк в функции dll пока ещё вошёл в билд беты.
Как вариант могу предложить использовать сложение элементов строк через разделитель и передачу этой суммы строк в библиотеку.
P.S.: Если не секрет, напишите, зачем Вам понадобилось передавать массив строк?
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Пытался так
И в mql5
Ни один вариант не работает. Пробовал делать аналог MqlStr для мт5 - та же самая ситуация. Везде выскакивает Access violation excetion.
Как передавать массивы строк по ссылке в dll?