2012-02-13 2 views
3

GetUserNameEx()를 호출 할 때 이상한 반환 크기에 대한 질문이 있습니다. 어쩌면 누군가가 이미이 문제에 직면했을 것입니다.GetUserNameEx()가 반환하는 버퍼 크기

저는 GetUserNameEx()를 두 번 호출합니다. 첫 번째는 필요한 버퍼 크기를 얻고 두 번째는 실제로 버퍼를 채 웁니다. 에서

documentation size 매개 변수에 대해이 글을 읽을 수 있습니다

  1. lpNameBuffer가 너무 작은 경우, 함수가 실패하고 GetLastError가 ERROR_MORE_DATA를 반환합니다. 이 매개 변수는 필수 버퍼 크기 인 (유니 코드 사용 여부와 상관없이) 유니 코드 문자 ()를 포함하며 종료 문자는 null입니다.

    이 값 (required_size)을 저장하면 성공시 반환되는 값으로 저장됩니다.

  2. 입력시이 변수는 TCHAR의 lpNameBuffer 버퍼 크기를 지정합니다. 함수가 성공하면 변수는 버퍼에 복사 된 TCHAR 수를 수신하며 종료 문자는 포함하지 않습니다.

    이 사람은 returned_size입니다.

이상한 것은 다음 required_size는 22 returned_size가 11

입니다, 내가 프로젝트 속성에서 문자 인코딩을 설정하면 설정 안 할 것입니다 그리고 난 다음, 유니 코드 문자 집합을 사용하는 Charachter 인코딩을 설정할 때 required_size은 11이고 returned_size도 11입니다.

어쩌면 나는 뭔가를 얻지 못할 수도 있지만, required_size은 변경되지 않을 것으로 예상됩니다. 아무도 이것을 이미 보았습니까?

감사합니다.

UPD : 여기는 code example입니다.

+0

코드를 게시하십시오. 문제를 더 쉽게 볼 수 있습니다. – Dennis

+0

코드 링크가있는 게시물을 업데이트했습니다. – kishkin

답변

4

나는 repro. 그건 버그 야. 그것은 필요한 크기의 두 배가되는 버퍼를 요구하기 때문에 결코 잘못되지 않습니다. 두 번째 호출에서 버퍼에 복사 된 실제 문자 수를 얻을 수 있으므로 문자열의 실제 크기를 알 수 있습니다. 나는 그것을 고치려고하지 않을 것이다. 문자열을 유니 코드에서 mbcs로 변환하기 전에 실제로 버퍼를 사용한다는 작은 확률이있다. 나는 그것의 아무 증거도 보지 않지만.

+0

감사합니다, 한스! – kishkin

+0

실제로. Raymond가 AppCompat을 다시 꺼내지 않도록하십시오. 실제로는 특대 버퍼를 필요로하는 하나의 Windows 버전에 하나의 코드 경로가있는 경우 OS 버전에서 특정 테스트 케이스에 실제로 필요하지 않더라도 더 나은 버퍼를 제공하는 것이 좋습니다. – MSalters