2012-02-13 23 views
3

GetUserNameEx()を呼び出すときに奇妙な戻りサイズに関する質問があります。たぶん誰かがこの問題に遭遇しているかもしれません。GetUserNameEx()が返すバッファのサイズ

私はGetUserNameEx()を2回呼び出します。最初に必要なバッファサイズを取得し、2番目に実際にバッファを設定します。で

documentationあなたはsizeパラメータについては、これを読むことができます:

  1. lpNameBufferが小さすぎる場合、関数は失敗し、GetLastErrorがERROR_MORE_DATAを返します。このパラメータは、Unicode文字(Unicodeが使用されているかどうかにかかわらず)であるのバッファサイズを受信します。これには、終端ヌル文字も含めてが含まれます。

    この値(required_size)を保存すると、正常に戻ったかどうかを確認できます。

  2. 入力時に、この変数は、lpNameBufferバッファのサイズをTCHARで指定します。関数が成功すると、変数はバッファにコピーされたTCHARの数を受け取ります。終端のヌル文字は含まれません。

    これはreturned_sizeです。

奇妙なことが、その後required_sizeは22とreturned_sizeは11

であり、私はプロジェクトのプロパティで文字エンコーディングを設定する場合に設定していないためにということであると私はその後、Unicode文字セットを使用するためのCharachterエンコーディングを設定するときrequired_sizeは11であり、returned_sizeも11です。

多分私は何かを得ることはできませんが、私はrequired_sizeは変更しないと予想しました。誰もこれを見たことがありますか?

ありがとうございます。

UPD:ここではcode exampleです。

+0

コードを投稿してください。問題を見るのが簡単でしょうか。 – Dennis

+0

コードにリンクされたポストを更新しました。 – kishkin

答えて

4

I repro。まあ、それはバグです。必要なサイズの2倍のバッファを要求するので、間違ったことはありません。 2番目の呼び出しでバッファにコピーされた実際の文字数を取得するので、文字列の実際のサイズを知ることができます。私はそれを修正しようとはしませんが、文字列をUnicodeからmbcsに変換する前にバッファを実際に使用することはあまりありません。私はそれの証拠は見ませんが。

+0

ありがとう、ハンス! – kishkin

+0

確かに。 RaymondがAppCompatをもう一度引っ張ってしまわないようにしてください。実際に特大のバッファが必要な1つのWindowsバージョンに1つのコードパスがある場合、OSバージョンで特定のテストケースで実際には必要ない場合でも、それを提供する方がよいでしょう。 – MSalters

関連する問題