字符串到 char* 封送
我编写了一个托管 C++ 类,它具有以下功能:
void EndPointsMappingWrapper::GetLastError(char* strErrorMessage)
{
strErrorMessage = (char*) Marshal::StringToHGlobalAnsi(_managedObject->GetLastError()).ToPointer();
}
如您所见,这是一个将最后一个错误的托管字符串复制到非托管世界 (char*
) 的简单方法。
在我的非托管类中,我这样调用该方法:
char err[1000];
ofer->GetLastError(err);
在托管 C++ 方法处放置断点表明该字符串已成功转换为 char*
。 但是,一旦我返回到非托管类,err[1000]
的内容就会丢失,并且再次为空。
I wrote a managed C++ class that has the following function:
void EndPointsMappingWrapper::GetLastError(char* strErrorMessage)
{
strErrorMessage = (char*) Marshal::StringToHGlobalAnsi(_managedObject->GetLastError()).ToPointer();
}
As you can see, this is a simple method to copy the managed string of the last error to the unmanaged world (char*
).
From my unmanaged class I call the method like this:
char err[1000];
ofer->GetLastError(err);
Putting a breakpoint at the managed C++ method shows that the string is successfully translated into the char*
. However, once I return to the unmanaged class, the content of err[1000]
is lost and it's empty again.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您正在分配传递的参数 (strErrorMessage) 的值,而不是将 Marshal::StringToHGlobalAnsi 返回的缓冲区内容复制到该地址。
正确的实现应该是:
长度是传递的缓冲区的大小。
strncpy()
将最多复制 len 个字节。 如果str的前n个字节中没有空字节,则目标字符串不会以空结尾。 因此,我们在缓冲区的最后一个字节中强制使用“\0”。You are assigning the value of the passed parameter (strErrorMessage) instead of copying to that address the content of the buffer returned by Marshal::StringToHGlobalAnsi.
A correct implementation should be:
The length is the size of the buffer passed.
strncpy()
will copy at the most len bytes. If there is no null byte among the first n bytes of the str, the destination string won't be null terminated. For that reason we force the '\0' in the last byte of the buffer.我们使用以下 C++ 类来为我们进行转换,并且效果很好。 您应该能够修改您的方法来使用它。
H 文件
CPP 文件
We use the following C++ Class to do the conversions for us and it works fine. You should be able to modify your method to use it.
H File
CPP File
问题是 StringToHGlobalAnsi 创建了一个新的非托管内存,并且没有复制到您打算使用的分配给 strErrorMessage 的内存中。
要解决此问题,您应该执行以下操作:
用法应如下所示:
有关详细信息,请查看此 msdn 文章
The problem is that StringToHGlobalAnsi creates a new unmanged memory and does not copy into the memory you intended to use which you assigned into strErrorMessage.
To resolve this you should do some thing like:
And the usage should look like:
for more information check out this msdn article