代码之家  ›  专栏  ›  技术社区  ›  Adam Haile

在c++/CLI中未识别的LpValf

  •  0
  • Adam Haile  · 技术社区  · 15 年前

    我试图使用下面的代码将一个本地字符串转换成C++中的托管字符串:

    System::String^ NativeToDotNet( const std::string& input )
    {
        return System::Runtime::InteropServices::Marshal::PtrToStringAnsi( (static_cast<LPVOID>)( input.c_str() ) );
    }
    

    我最初发现了密码 here :

    但当我尝试构建时,它抛出了错误:

    syntax error : identifier 'LPVOID'
    

    知道怎么解决这个问题吗?

    3 回复  |  直到 15 年前
        1
  •  2
  •   tragomaskhalos    15 年前

    这通常以各种形式出现——最简单的答案是:不要编写自己的函数,请参见: http://msdn.microsoft.com/en-us/library/bb384865.aspx

        2
  •  1
  •   Drew Hoskins    15 年前

    lpvoid只是void*的别名。LP代表“长指针”,这是一种老式的“机器大小指针”的说法,根据进程的不同,可以是32位或64位。

    只使用 static_cast<void *>

    在一个或多个头文件中,有一个 #define LPVOID (void *)

    你还没有包含这样的文件。

        3
  •  0
  •   Ben Voigt    15 年前

    铸造至(相同 CV限定符 ) void* 始终是隐式可能的,您不应该看到强制转换尝试这样做。尝试删除时出错 const 用一个 static_cast

    尝试此操作,它还可以正确处理嵌入的nul字符:

    using System::Runtime::InteropServices::Marshal::PtrToStringAnsi;
    return PtrToStringAnsi( const_cast<char*>(&input[0]), input.size() );
    

    这个 const_cast<char*> 注意到.NET中缺少常量正确性这一愚蠢之处。

    推荐文章