Я получил 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
Я не копался в коде, но пришел к выводу о работе с библиотеками DLL, чтобы не возвращать ничего, кроме примитивных типов из функций DLL. Это связано с тем, что из-за разных компиляторов или разных параметров или параметров проекта структуры и классы не выровнены одинаково, не имеют одинакового размера в DLL и в коде, вызывающем DLL.
Таким образом, возвращение списка из DLL может считаться неправильным в приложении вызывающей стороны.
То же самое относится и к выбрасыванию исключений из DLL — перехваченный класс может быть неверно истолкован перехваченным кодом.
Поэтому лучше всего экспортировать только функции C, которые возвращают примитивные типы (для обозначения кодов ошибок).
Других решений пока нет …