2012-02-13 139 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