【问题标题】:Managed c++ std::string not accessible in unmanaged c++托管 c++ std::string 在非托管 c++ 中不可访问
【发布时间】:2011-01-26 20:57:27
【问题描述】:

在非托管 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());,这个语句字符串被正确复制。即正确复制带有字符指针的字符串。

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

【问题讨论】:

  • 是“托管 C++”还是 C++/CLI?
  • 您确定支持混合 VC++6.0 和 VC++ 2008 对象吗?

标签: c++ managed stdstring


【解决方案1】:

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

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

如果您想创建一个 .dll,该 .dll 可从使用与该 .dll 不同的编译器/库编译的代码中使用,那么纯 C 接口是可行的方法。


请参阅this 相关问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 2010-12-13
    • 2013-01-07
    • 2011-11-23
    相关资源
    最近更新 更多