托管的c ++ std :: string在非托管c ++中无法访问

时间:2010-03-12 14:57:17

标签: c++ managed stdstring

在非托管c ++ dll中,我有一个函数,它将常量std::string作为参数

 Prototype : void read ( const std::string &imageSpec_ )

我通过传递std::string从托管c ++ dll调用此函数 当我调试非托管c ++代码时,参数imageSpec_正确显示该值,但不允许我将该值复制到其他变量中。

 imageSpec_.copy( sFilename, 4052 );

它将imageSpec_的长度显示为0(零) 如果我尝试复制像std::string sTempFileName(imageSpec_);这个语句字符串新字符串是一个空字符串。

但对于std::string sTempFileName(imageSpec_.c_str());,此语句字符串会被正确复制。即使用charpointer字符串被正确复制。

以这种方式复制将需要对非托管c ++代码进行重大更改 我正在Visual Studio 6.0中构建非托管代码,并在Visual Studio 2008中管理c ++ 托管c ++中是否有任何特定的设置或代码更改可以解决问题?

1 个答案:

答案 0 :(得分:1)

  

我在Visual中构建非托管代码   Studio 6.0和Visual Studio 2008中的托管c ++。

您正在尝试将Visual Studio 6.0的std::string实现复制到Visual Studio 2008的std::string实现中。如果要跨DLL边界传递C ++对象,则必须非常小心 - 您必须使用完全相同的对象布局(特定于编译器)和库实现来构建边界的两侧,并针对兼容的运行时构建它们。

如果你想创建一个可以从使用与.dll不同的编译器/库编译的代码中使用的.dll,那么就可以使用纯C接口了。


请参阅this相关问题。