我得到了一个带有以下原型的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;
}
Ť
答案 0 :(得分:0)
我没有深入研究代码,但是我在使用DLL时得出的结论是不返回DLL函数中的原始类型。这是因为由于不同的编译器或不同的开关或项目设置结构和类没有对齐,所以在DLL和调用DLL的代码中没有相同的大小。
因此,在调用者应用程序中,从DLL返回列表可能会被视为格式错误。
同样的问题是从DLL中抛出异常 - 抛出的类可能会被捕获代码误解。
因此,最好只导出返回基本类型的C函数(表示错误代码)。