2009-03-02 3 views
0

내가 이런 기능이 도움이 필요하십니까 : 나는 MessageBoxW()와 함께 입력 LPCWSTR 텍스트를 표시 할 때WideCharToMultiByte를 사용하여 LPCWSTR을 변환합니다.

BOOL WINAPI MyFunction(HDC hdc, LPCWSTR text, UINT cbCount){ 

char AnsiBuffer[255]; 
int written = WideCharToMultiByte(CP_ACP, 0, text, cbCount, AnsiBuffer , 0, NULL, NULL); 
if(written > -1) AnsiBuffer[written] = '\0'; 

if(written>0){ 

    ofstream myfile; 
    myfile.open ("C:\\example.txt", ios::app); 
    myfile.write(AnsiBuffer, sizeof(AnsiBuffer)); 
    myfile.write("\n", 1); 
    myfile.close(); 

} 


.... 

를 텍스트가 미세을 보여줍니다. 멀티 바이트로 변환하려고하면 반환 값이 정상적으로 보입니다 (예 : 22, 45 등). 결과는 횡설수설 문자열입니다 (ex ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ). 제안?

+0

참고. http://msdn.microsoft.com/en-us/library/f1d6b0fk(VS.80).aspx – Andy

답변

2

두 가지 문제가 있습니다.

1) 멀티 바이트 버퍼의 크기는 WideCharToMultiByte에 '0'을 전달합니다. 문서를 읽으면 함수는 결과 바이트 수를 반환하지만 실제 변환은 수행하지 않습니다. (이것은 나중에 정확한 크기의 버퍼를 할당하고 함수를 호출 할 수있게 해줍니다.)

2) file.write sizeof (AnsiBuffer)에서 버퍼에있는 내용과 관계없이 255 바이트가 기록됩니다. sizeof는 변수의 크기를 반환하는 컴파일 타임 계산입니다. 문자열의 길이를 나타내는 'written'변수로 바꾸어야합니다.

1

0을 전달하는 대신 버퍼의 길이를 API에 전달해야합니다. 0을 전달하면이 함수는 필요한 버퍼 길이를 반환하지만 쓰기는 수행하지 않습니다. 초기화되지 않은 배열의 결과가 표시됩니다.

여기에 적절한 장소에서 255과 오른쪽 전화 : 당신이 파일을 유니 코드 (와이드) 문자열을 작성하는 wofstream을 사용할 수 있습니다

int written = WideCharToMultiByte(CP_ACP, 0, text, cbCount, AnsiBuffer , 255, NULL, NULL);