.net - 字符串到 char* 编码

标签 .net c++ managed-c++

我编写了一个具有以下功能的托管 C++ 类:

void EndPointsMappingWrapper::GetLastError(char* strErrorMessage)
{
    strErrorMessage = (char*) Marshal::StringToHGlobalAnsi(_managedObject->GetLastError()).ToPointer();
}

如您所见,这是将上次错误的托管字符串复制到非托管世界 (char*) 的简单方法。

在我的非托管类中,我这样调用方法:

char err[1000];
ofer->GetLastError(err);

在托管 C++ 方法处放置断点表明字符串已成功转换为 char*。但是,一旦我返回到非托管类,err[1000] 的内容就会丢失并且再次为空。

最佳答案

您正在分配传递的参数 (strErrorMessage) 的值,而不是将 Marshal::StringToHGlobalAnsi 返回的缓冲区内容复制到该地址。

正确的实现应该是:

void EndPointsMappingWrapper::GetLastError(char* strErrorMessage, int len) 
{ char *str = (char*) Marshal::StringToHGlobalAnsi(_managedObject->GetLastError()).ToPointer(); 
 strncpy(strErrorMessage,str,len);
 strErrorMessage[len-1] = '\0';
 Marshal::FreeHGlobal(IntPtr(str));
}

长度是传递的缓冲区的大小。

strncpy() 将复制最多 len 个字节。如果 str 的前 n 个字节中没有空字节,则目标字符串不会以空结尾。出于这个原因,我们在缓冲区的最后一个字节中强制使用“\0”。

关于.net - 字符串到 char* 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/269932/

相关文章:

.net - UI 和后台线程之间的交叉线程

c# - 忽略 Json.net 中的空字段

c++ - 如何处理这种副作用?

c++ - 在 MacOS 10.9 (Mavericks) 上构建 Boost.Python 应用程序

C++ 模板蒯因

c++-cli - 订阅事件的 C++/CLI 语法是什么?

.net - 一次性清除azure服务总线队列

.net - Visual Studio 将不必要的 XML doc 文件打包到 WP8 XAP 中

C# 自动属性 ​​-- 设置默认值

c++ - 将 dll 引用添加到托管 C++ 项目时出现编译器错误