这个我写的一个dll导出函数
#ifdef INDEX_EXPORTS
#define INDEX_API __declspec(dllexport)
#else
#define INDEX_API __declspec(dllimport)
#endif
    
INDEX_API bool _stdcall get_segment_word(wchar_t const *_inconref_sentence,
                       unsigned int _in_offset,
                       unsigned int _in_mode,
                       std::vector<std::wstring>& _out_vecWordList);   
简单的说就是以一个vector<std::wstring>作为输出参数
然后在测试工程中调用{
HMODULE hModule;
typedef bool __stdcall fun_get_segment_word(wchar_t const *_inconref_sentence,
unsigned int _in_offset,
unsigned int _in_mode,
std::vector<std::wstring>& _out_vecWordList);      hModule = ::LoadLibrary(L"**.dll"); fun_get_segment_word   *pfun_get_segment_word;   
std::vector<std::wstring> vecWordList;
std::wstring word = L"school";
if(hModule)
{
pfun_get_segment_word = (fun_get_segment_word*)GetProcAddress(hModule,"get_segment_suggest");    (pfun_get_segment_word)((wchar_t const *)word.c_str(), 2, -1, vecWordList); ::FreeLibrary(hModule);   
}
return 0;
}
但是离开上面的作用域后 会出现堆栈崩溃 疑似释放std::vector<std::wstring> vecWordList的时候对堆栈进行了操作!
请问这到底是怎么回事 在dll导出函数参数中有vector wstring时 可能会出现问题是吗? 请大虾帮忙!

解决方案 »

  1.   

    LZ能否把fun_get_segment_word函数的实现帖出来看看?
      

  2.   

    保证调用者和DLL的call conversion都是__stdcall
      

  3.   

    http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/83a026d8-09b1-4d57-8c4a-ab2d139624b4
      

  4.   

    dll内get_segment_word 函数里,不能对_out_vecWordList这个vector进行添加元素(push_back, insert)。跨dll时,内存应该遵循哪里申请哪里释放的原则。 有两种办法:1) 如果知道vector的元素个数,可以在调用的地方先把vector.resize()需要的大小,然后传入dll使用,dll内不要对传入的vector进行添加元素的操作。2)如果不确定元素个数,则在dll内分配vector的大小,再把该vector的指针传出(参数类型为std::vector<std::wstring>**)。调用的地方不要对传出的vector进行 添加元素的操作
      

  5.   

    STL的容器不是线程安全的,不建议作为模块之间的参数进行传递使用。