2010-04-26 79 views
0

我尝试使用下面的代码到本地字符串转换为在C托管字符串++ \ CLI:LPVOID用C不承认++/CLI

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

我最初发现的代码here

但是当我尝试构建它会抛出错误:

syntax error : identifier 'LPVOID' 

任何想法如何解决这个问题?

回答

1

LPVOID只是void *的别名。 LP代表“长指针”,这是一种旧式的“机器大小的指针”方式,取决于过程32位或64位。

只需使用 static_cast<void *>

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

您还没有这样的文件。

+0

这让犯错或者:'static_cast':无法从'const char *'转换为'void *' – 2010-04-26 19:08:27

+0

@Adam:...这是非常合理的。任何时候你有一个'void *',你都可以期望把它转换成其他类型的指针来做任何有用的指针。 – 2010-04-26 19:23:49

+0

不,它将input.c_str()的输出转换为void * ... – 2010-04-26 19:27:18

0

铸造到(相同cv-qualifiersvoid*总是隐含可能的,你永远不应该看到一个演员试图这样做。错误是试图删除conststatic_cast

试试这个,这也是正确处理内嵌的NULL字符:

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

const_cast<char*>需要是缺乏常量,正确性愚蠢的照顾。 NET