C ++ DLL, возвращающая указатель на std :: list & lt; std :: wstring & gt;

Я получил DLL со следующим прототипом:

DLL_EXPORT std::list<std::wstring>* c_ExplodeWStringToList(std::wstring in_delimiter, std::wstring in_string, int in_limit);

Приложение использует это так:

std::list<std::wstring>* exploded = mydllclass->c_ExplodeWStringToList(L" ", in_command.c_str(), 0);

Это прекрасно работает под XP 32, но когда я пробую это дома с моей Vista 64, моя программа просто закрывается. Нет ошибки и нет предупреждения?

Несколько дней назад DLL возвращала список напрямую — без указателя. Но я переключился на VC ++ 2010 Express и не смог скомпилировать свою DLL без этой модификации.

Что-то, чего я здесь не вижу?

Спасибо 🙂

Обновить:

DLL_EXPORT std::list<std::wstring>* c_ExplodeWStringToList(std::wstring in_delimiter, std::wstring in_string, int in_limit)
{
std::list<std::wstring>* returnlist = new std::list<std::wstring>();
std::list<std::wstring>* stringlist = new std::list<std::wstring>();
UINT pos = 0;

while(true)
{
pos = in_string.find(in_delimiter, 0);

if(pos == std::string::npos)
{

stringlist->push_back(in_string.substr(0, pos));
break;
}
else
{

stringlist->push_back(in_string.substr(0, pos));
in_string = in_string.substr(pos + in_delimiter.length());
}
}

// ****
// Here is missing some code I've commented out while searching for the error.
// ****
returnlist = stringlist;

return returnlist;
}

T

2

Решение

Я не копался в коде, но пришел к выводу о работе с библиотеками DLL, чтобы не возвращать ничего, кроме примитивных типов из функций DLL. Это связано с тем, что из-за разных компиляторов или разных параметров или параметров проекта структуры и классы не выровнены одинаково, не имеют одинакового размера в DLL и в коде, вызывающем DLL.

Таким образом, возвращение списка из DLL может считаться неправильным в приложении вызывающей стороны.

То же самое относится и к выбрасыванию исключений из DLL — перехваченный класс может быть неверно истолкован перехваченным кодом.

Поэтому лучше всего экспортировать только функции C, которые возвращают примитивные типы (для обозначения кодов ошибок).

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]