【问题标题】:C++ DLL returning pointer to std::list<std::wstring>C++ DLL 返回指向 std::list<std::wstring> 的指针
【发布时间】:2012-11-24 21:01:42
【问题描述】:

我得到了一个具有以下原型的 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 代码的外观和现在的外观。

标签: c++ pointers dll windows-xp windows-vista


【解决方案1】:

我没有深入研究代码,但我得出的关于使用 DLL 的结论是,除了从 DLL 函数返回原始类型外,不返回任何内容。这是因为由于不同的编译器或不同的开关或项目设置,结构和类没有对齐,在 DLL 和调用 DLL 的代码中没有相同的大小。

因此,从 DLL 返回列表可能会被认为在调用者应用程序中格式不正确。

从 DLL 中引发异常也是如此 - 引发的类可能会被捕获代码误解。

因此,最好只导出返回原始类型(以表示错误代码)的 C 函数。

【讨论】:

  • 有道理.. 但是你对我有什么提示吗?如何实现这样的功能并只返回一个原始数据类型?自动取款机我没有想法...... :(
猜你喜欢
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多