GetUserNameEx() 返回的缓冲区大小

发布于 2025-01-05 20:13:43 字数 1072 浏览 0 评论 0原文

我有一个关于调用 GetUserNameEx() 时奇怪的返回大小的问题。也许有人已经遇到过这个问题了。

我调用 GetUserNameEx() 两次:第一次获取所需的缓冲区大小,第二次实际填充缓冲区。

文档 您可以阅读有关尺寸参数的内容:

  1. <块引用>

    如果 lpNameBuffer 太小,函数会失败并且 GetLastError 返回 ERROR_MORE_DATA。此参数接收所需的缓冲区大小,以 Unicode 字符表示(无论是否使用 Unicode),包括终止空字符。

    我保存此值 (required_size) 以与成功时返回的值进行检查。

  2. <块引用>

    输入时,该变量指定 lpNameBuffer 缓冲区的大小(以 TCHAR 为单位)。如果函数成功,变量将接收复制到缓冲区的 TCHAR 数量,不包括终止空字符。

    这个是returned_size

奇怪的是,如果我将项目属性中的字符编码设置为“未设置”,则 required_size 为 22,returned_size 为 11。

当我将 Charachter Encoding 设置为“使用 Unicode 字符”时设置,则 required_size 为 11,returned_size 也为 11。

也许我没有得到什么,但我希望 required_size 不会改变。有人已经看过这个了吗?

谢谢。

UPD:这里是代码示例

I have a question about strange return sizes when calling GetUserNameEx(). Maybe someone has encountered this problem already.

I call GetUserNameEx() two times: first to get required buffer size and second to actually populate the buffer.

In the documentation you can read this about the size parameter:

  1. If lpNameBuffer is too small, the function fails and GetLastError returns ERROR_MORE_DATA. This parameter receives the required buffer size, in Unicode characters (whether or not Unicode is being used), including the terminating null character.

    I save this value (required_size) to check with the one returned on success.

  2. On input, this variable specifies the size of the lpNameBuffer buffer, in TCHARs. If the function is successful, the variable receives the number of TCHARs copied to the buffer, not including the terminating null character.

    This one is returned_size.

The strange thing is that if I set Character Encoding in project properties to Not Set, then required_size is 22 and returned_size is 11.

And when I set Charachter Encoding to Use Unicode Character Set, then required_size is 11 and returned_size is 11 too.

Maybe I do not get something, but I expected required_size not to change. Has anyone saw this already?

Thank you.

UPD: here is the code example.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

来日方长 2025-01-12 20:13:43

我重现。嗯,这是一个错误。它永远不会出错,因为它要求的缓冲区是所需大小的两倍。您将在第二次调用时获得复制到缓冲区的实际字符数,这样您就知道字符串的实际大小。我不会尝试修复它,在将字符串从 Unicode 转换为 mbcs 之前,它实际使用缓冲区的可能性很小。虽然我没有看到任何证据。

I repro. Well, it's a bug. It never goes wrong because it asks for a buffer that's twice the required size. You'll get the actual number of characters copied to the buffer on the second call so you do know the real size of the string. I wouldn't try to fix it, there are small odds that it actually uses the buffer before converting the string from Unicode to mbcs. Although I see no evidence of it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文