2012-02-13 102 views
3

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

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

documentation你可以看到这篇关于大小参数:

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

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

  2. 在输入时,该变量指定TCHAR中的lpNameBuffer缓冲区的大小。如果函数成功,变量接收复制到缓冲区的TCHAR数量,不包括终止空字符。

    这一个是returned_size

奇怪的是,如果我在项目属性中设置字符编码未设置,则required_size是22和returned_size是11

而当我设Charachter编码使用Unicode字符集,然后required_size是11,returned_size也是11。

也许我没有得到什么,但我预计required_size不能改变。有没有人看到过这个?

谢谢。

UPD:这里是code example

+0

发布您的代码。会更容易看到问题。 – Dennis 2012-02-13 12:34:56

+0

通过指向代码的链接更新了帖子。 – kishkin 2012-02-13 14:32:59

回答

4

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

+0

谢谢,汉斯! – kishkin 2012-02-13 13:15:27

+0

确实。不要让Raymond再次将AppCompat取出。如果在一个Windows版本上有一个实际需要超大缓冲区的代码路径,那么即使在您的特定测试用例中实际不需要您的操作系统版本,也要提供它。 – MSalters 2012-02-13 16:21:01