Visual c++ 无法在DLL中为std::string赋值 我有一个VS 2010 C++解决方案,有两个项目,一个生成DLL,另一个是DLL函数的驱动程序。所有这些代码 char cstring [256]; strcpy (cstring, "C String"); std::string string1 = "Test String"; std::string string2 (string1); std::string string3; string3.assign (cstring);

Visual c++ 无法在DLL中为std::string赋值 我有一个VS 2010 C++解决方案,有两个项目,一个生成DLL,另一个是DLL函数的驱动程序。所有这些代码 char cstring [256]; strcpy (cstring, "C String"); std::string string1 = "Test String"; std::string string2 (string1); std::string string3; string3.assign (cstring);,visual-c++,dll,stdstring,Visual C++,Dll,Stdstring,在驾驶室工作得很好。但是,如果在DLL项目中的任何位置放置相同的代码,则无法成功为string1、string2和string3分配任何值。大多数情况下,调试器将它们显示为错误的Ptr。看起来它们在内存中分配得不好 我尝试将std::string作为类成员字段、自动变量和静态变量。但这些方法都没有达到预期效果。有人能帮我找出原因吗?我认为原因是缺乏应用程序二进制接口标准(ABI)。这篇文章完美地描述了这个问题: 也可能是“属性>>c/c++>>代码生成>>运行时库设置”(/MT和/MD设置),

在驾驶室工作得很好。但是,如果在DLL项目中的任何位置放置相同的代码,则无法成功为string1、string2和string3分配任何值。大多数情况下,调试器将它们显示为错误的Ptr。看起来它们在内存中分配得不好


我尝试将std::string作为类成员字段、自动变量和静态变量。但这些方法都没有达到预期效果。有人能帮我找出原因吗?

我认为原因是缺乏应用程序二进制接口标准(ABI)。这篇文章完美地描述了这个问题:


也可能是“属性>>c/c++>>代码生成>>运行时库设置”(/MT和/MD设置),您需要确保库项目和使用项目是相同的。

我认为原因是缺少应用程序二进制接口标准(ABI)。这篇文章完美地描述了这个问题:


<> P>可能是“属性> C/C++”>代码生成>运行库设置(/MT和MD设置),您需要确保库项目和使用项目是相同的。

标准DLL问题,当DLL和EXE不使用完全相同的标准C++库时发生。可以像EXE内置调试一样简单,因此使用msvcp100d.dll和dll内置版本,因此使用msvcp100.dll。使用/MT而不是/MD构建是另一个传统错误。这两个项目必须使用完全相同的编译器版本和生成设置,以便只使用库的一个副本。使用调试>窗口>模块进行诊断。可以为true。但是,很难找到用于构建其他库的选项。今天我刚刚发现,在VS2010环境之外的安装中,驱动程序和DLL可以顺利运行。所以,这听起来是一个运行时的问题。如果你不知道,不匹配的几率会上升到99.9%个程序员,他们会从他们的DLL接口中暴露出STD类型,需要有一个电话,一定要使用一个。标准DLL问题,当你的DLL和EXE不使用完全相同的标准C++库时。可以像EXE内置调试一样简单,因此使用msvcp100d.dll和dll内置版本,因此使用msvcp100.dll。使用/MT而不是/MD构建是另一个传统错误。这两个项目必须使用完全相同的编译器版本和生成设置,以便只使用库的一个副本。使用调试>窗口>模块进行诊断。可以为true。但是,很难找到用于构建其他库的选项。今天我刚刚发现,在VS2010环境之外的安装中,驱动程序和DLL可以顺利运行。因此,这听起来是一个运行时问题。如果你不知道,那么不匹配的几率会上升到99.9%,从DLL接口公开std类型的程序员需要一个电话,请务必使用一个。是的,从DLL外部传入的字符串确实已损坏。但更大的问题是,本地定义的字符串甚至无法初始化!它们几乎都是错误的Ptr。您是否检查过两个项目(dll和implementor)中的运行时库设置是否相同?是的,从dll外部传入的字符串确实已损坏。但更大的问题是,本地定义的字符串甚至无法初始化!它们几乎都是错误的Ptr。您是否检查过两个项目(dll和实现者)中的运行时库设置是否相同?