【问题标题】:dllexported appended string is corruptdll 导出的附加字符串已损坏
【发布时间】:2011-04-20 16:54:52
【问题描述】:

我有一个加载 dll 的 exe。我都写了。

我正在导出一个函数 foo,它返回一个 std::wstring。

它所做的只是说

std::wstring blah = L"rgjwgfw";

  return blah.append(L"hey");

在我导入 foo 的 exe 中,字符串已损坏。一旦我从调用 foo 的函数返回,我就会得到失败的断言。有时我会收到一条消息,说 Windows 在 foo.exe 中触发了一个断点。这可能是由于堆损坏等......这也可能是由于用户在 foo.exe 具有焦点时按 f12。等等……

知道为什么会这样吗?如果我从 foo 中删除附加行并且 jsut 返回原始字符串,它不会发生,没有问题。

谢谢

【问题讨论】:

  • 您确定两个 dll 都使用相同的选项(发布或调试)进行编译吗? STL 模板可能有不同的大小

标签: c++ string debugging dllimport dllexport


【解决方案1】:

这是一个很常见的问题。您需要链接 DLL 和可执行文件以使用 DLL 中的标准库。这样他们就可以共享标准库的一个公共副本和一个公共堆。否则,您最终会得到可执行文件中的代码尝试使用一个堆,而 DLL 中的代码使用单独的堆。当您通过边界传递几乎任何使用动态分配的东西时,每个都假定对象中动态分配的缓冲区来自其自己的堆。几乎任何操作不仅会破坏对象,还会破坏整个堆。

【讨论】:

  • 我不能这样做,因为我正在静态链接 mfc。使用 dll 运行时库需要动态链接到 mfc。有没有办法做到这一点而不使函数成为你调用两次的函数?一次获取缓冲区的长度,然后另一次实际用数据填充缓冲区?
  • 我怀疑此时你所能做的就是使用一个不同的字符串类,它的所有代码都在 DLL 中(问题的出现主要是因为分配器是一个模板参数,所以在可执行文件和 DLL 是分开的)。
猜你喜欢
  • 2014-06-25
  • 2020-07-19
  • 2016-05-31
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
相关资源
最近更新 更多