在非托管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 ++中是否有任何特定的设置或代码更改可以解决问题?
答案 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相关问题。