Visual c++ visualc&x2B+;发布版本-字符串在通过DLL传递时是否因为使用不同的运行时版本编译而损坏?

Visual c++ visualc&x2B+;发布版本-字符串在通过DLL传递时是否因为使用不同的运行时版本编译而损坏?,visual-c++,dll,corruption,Visual C++,Dll,Corruption,在发布模式下构建之后,我看到了在调试模式下没有发生的异常。调试发布版本时,字符串引用似乎没有从EXE(我们的应用程序)正确传递到接收字符串引用的DLL 我们的EXE代码如下所示: string contents = "handle_message(): received=" + msg->encode(); LOG4CXX_DEBUG(logger, contents); CharMessageBuffer& CharMessageBuffer::operator<<

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

我们的EXE代码如下所示:

string contents = "handle_message(): received=" + msg->encode();
LOG4CXX_DEBUG(logger, contents);
CharMessageBuffer& CharMessageBuffer::operator<<(const std::basic_string<char>& msg) {
   if (stream == 0) {
      buf.append(msg);
   } else {
      *stream << msg;
   }
   return *this;
}
LOG4CXX_调试
将转到
LOG4CXX.dll
,其代码如下所示:

string contents = "handle_message(): received=" + msg->encode();
LOG4CXX_DEBUG(logger, contents);
CharMessageBuffer& CharMessageBuffer::operator<<(const std::basic_string<char>& msg) {
   if (stream == 0) {
      buf.append(msg);
   } else {
      *stream << msg;
   }
   return *this;
}
log4cxx.dll(dll)

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

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

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

另请参见:

隐含的问题是:“是否有一种方法可以将数据(希望使用字符串和其他STL容器)传递到visual studio的另一个版本的DLL,而不是我正在使用的版本?”

除了使用POD,可能还有三种方法:共享内存、套接字(到本地主机)和MSMQ。所有这些方法都需要额外的广泛编程,但更深层次的答案在于接口如何改变输入参数


我已经找到了一个解决互联网上字符串传递问题的可能方法。它消除了一层腐败;将指向容器的指针强制转换为uint并传递uint。取消对指针的uint引用,对象就会显示出来。注意,在此过程中,自动PTR通常会被删除,所以不要使用它们。如果传递的对象的偏移量仍然不正确(VS08传递给VS13时发生了这种情况),则传递字符串的c_str()。这当然不雅观,但我们需要知道所有的选择。在代码项目(2012年11月22日)中,请参阅“如何:从DLL导出C++类”。这就是问题所在。我用VisualStudio2010重新编译了DLL,问题就解决了。