我编写了一个具有以下功能的托管 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/