GetUserNameEx() 返回的缓冲区大小

Posted

技术标签:

【中文标题】GetUserNameEx() 返回的缓冲区大小【英文标题】:Size for the buffer which GetUserNameEx() returns 【发布时间】:2012-02-13 12:01:01 【问题描述】:

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

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

在documentation你可以读到这个关于size参数的内容:

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

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

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

    这个是returned_size

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

当我将字符编码设置为使用 Unicode 字符集时,required_size 是 11,returned_size 也是 11。

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

谢谢。

UPD:这里是code example。

【问题讨论】:

发布您的代码。会更容易看到问题。 用代码链接更新了帖子。 【参考方案1】:

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

【讨论】:

确实如此。不要让 Raymond 再次拉出他的 AppCompat 胫骨。如果在一个 Windows 版本上有一个代码路径实际上需要超大缓冲区,那么您最好在您的操作系统版本上提供它,即使在您的特定测试用例中实际上不需要它。

以上是关于GetUserNameEx() 返回的缓冲区大小的主要内容,如果未能解决你的问题,请参考以下文章

InnoDB 缓冲池大小占总 RAM 的百分比 - (总 RAM 的缓冲池大小)返回无数据

如何扩展pyserial的输入缓冲区大小

Android Studio logcat 历史记录/缓冲区大小

串口通信缓冲区大小上限是多少?默认是512字节。

ffmpeg“低估了所需的缓冲区大小”

针对不同缓冲区大小的不同内存对齐