Visual C++ 发行版本 - 当通过 DLL 传递时,字符串是否会因为使用不同的运行时版本编译而损坏?

Sam*_*erg 4 dll corruption visual-c++

在发布模式下构建后,我看到了在调试模式下未发生的异常。调试发布版本时,字符串引用似乎没有从 EXE(我们的应用程序)正确传递到接收字符串引用的 DLL。

我们的 EXE 代码如下所示:

string contents = "handle_message(): received=" + msg->encode();
LOG4CXX_DEBUG(logger, contents);
Run Code Online (Sandbox Code Playgroud)

LOG4CXX_DEBUGlog4cxx.dll,其代码如下所示:

CharMessageBuffer& CharMessageBuffer::operator<<(const std::basic_string<char>& msg) {
   if (stream == 0) {
      buf.append(msg);
   } else {
      *stream << msg;
   }
   return *this;
}
Run Code Online (Sandbox Code Playgroud)

查看调试器中的调用堆栈,当我向下导航到包含源代码的框架时,我可以看到这contents是一个带有size=583, capacity=838.

log4cxx.dll在(堆栈中上面的下一帧) 内部的帧中,字符串引用显示size=838, capacity=363113231(并且值都是垃圾)。

我们的应用程序和 log4cxx.dll 都是在同一台计算机上编译的,使用相同的运行时设置 (/MD),但 Visual Studio 版本不同。log4cxx dll 是使用 Visual Studio 2008 编译的,我们的应用程序是使用 Visual Studio 2010 编译的。在 2 个对象上运行 dumpbin 显示:

我们的应用程序(EXE)

MSVCP100.dll
MSVCR100.dll
Run Code Online (Sandbox Code Playgroud)

log4cxx.dll (DLL)

MSVCP90.dll
MSVCR90.dll
Run Code Online (Sandbox Code Playgroud)

这个问题是因为他们使用不同的运行时版本吗?

Joc*_*ach 5

如果在 DLL/EXE 边界(如 STL 字符串或 CRT FILE 指针)之间传递非 POD(普通旧数据类型),则必须使用相同的共享CRT。

对于您的情况,您必须使用相同的编译器重新编译所有 DLL/LIB!

另请参阅:我可以为 Dll 传递 std::string 以及我可以用 DLL 做什么?