2014-04-06 7 views
1

필자는 FindFirstFile 및 FindNextFile을 사용하여 디렉토리를 역방향으로 검색하기 위해 시스템에서 작업을하고 있었지만 이해가되지 않는 문제가 발생했습니다.매우 이상한 LPCTSTR의 동작

다음은 코드 스 니펫입니다. 나는 Visual Studio를 사용하면 제외한 모든 볼 수 있듯이 2008 년

enter image description here

하지만 마지막 문자와 '\'는 볼 수없는 수 있으며, 나머지는 온을 사용하고

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine 
        ,int nCmdShow) 
{  
    searchDrive((LPCTSTR)"C:\\",(LPCTSTR)"*.bdjf"); 
    return 0; 
} 

bool searchDrive(LPCTSTR lpFolder, LPCTSTR lpFilePattern) 
{ 

    TCHAR szFullPattern[MAX_PATH]; 

    WIN32_FIND_DATA FindFileData; 

    HANDLE hFile = INVALID_HANDLE_VALUE; 

    PathCombine(szFullPattern, lpFolder, L"x"); 

    MessageBox(NULL,szFullPattern,lpFilePattern,MB_ICONWARNING | 
               MB_CANCELTRYCONTINUE | 
               MB_DEFBUTTON2); 

    HANDLE hFind = FindFirstFile(szFullPattern, &FindFileData); 

아시아 문자로 표시됩니다.

(주 내 코드와 다른 문제의 대해 걱정하지 마십시오.)

이 평가 될 것입니다 일어나고있는 이유가 뭘까요.

+2

고대 Windows 프로그램을 포팅하지 않는 한'TCHAR'과 그 ilk를 사용하지 마십시오. – Deduplicator

+1

당신은 컴파일러에게 거짓말을했고, 그것은 당신에게 복수를했습니다. –

답변

0

당신이 모르는 모든 캐스트를 제거하십시오 당신이 일을하고 캐스트가 올바른 작업을 위해 이 켜지지을 이유를 설명 할 수 정확히. 컴파일러를 꺼내지 말고 대신 말하도록하십시오 : -Wall -Wextra을 사용하고 모든 경고를 적절히 처리하십시오.

이렇게하면 오류가 눈에 띄게 나타납니다. 기본적으로

searchDrive((LPCTSTR)"C:\\",(LPCTSTR)"*.bdjf"); 

이, 비주얼 스튜디오 유니 코드 모드에서 프로그램을 컴파일 :

4

는 여기에 귀하의 문제입니다. 따라서 "ANSI"(8 비트 문자) 문자열을 모두 "유니 코드"(16 비트 문자) 문자열 유형으로 변환합니다.

문자열을 변환하지 않습니다. 컴파일러에게 그들이 유니 코드 문자열 인 것처럼 가장하는 것을 알려줍니다. 이것이 효과가 없다는 것은 거의 놀라운 일이 아닙니다. 단점은 ANSI 문자의 각 쌍이 단일 유니 코드 문자로 처리된다는 것입니다.

당신은이 같은 문제를 해결할 수 있습니다 :

searchDrive(TEXT("C:\\"), TEXT("*.bdjf")); 

하지만 ANSI 모드를 지원하는 특별한 이유가없는 한,이

searchDrive(L"C:\\", L"*.bdjf"); 

를 사용하여 선언을 변경하는 것이 더 나은 여전히 ​​것을 searchDriveLPCTSTR 대신 LPCWSTR을 사용하십시오.

+0

@ Remy의 수정에 관해서는 : http://blogs.msdn.com/b/oldnewthing/archive/2004/02/12/71851.aspx에서 더 많은 정보를 얻을 수 있습니다. http://stackoverflow.com/questions/2074579/should-i-use-t-or-text-on-c-string-literals도 관심의 대상이 될 수 있습니다. –

1

변경이 줄이로

searchDrive((LPCTSTR)"C:\\",(LPCTSTR)"*.bdjf"); 

:

searchDrive(L"C:\\", L"*.bdjf"); 

또한 TEXT("C:\\")TEXT("*.bdjf") 해당 문자열 문자 변환을 수행하기 위해 말할 수있다.

일반적으로 TCHAR의 사용을 중지하고 어디에서나 유니 코드와 긴 문자열을 사용해야합니다.

+0

UTF-16을 의미합니까? – Deduplicator

+0

@Deduplicator - 똑같은, * 오른쪽 *? – selbie

+0

많은 Windows Coders가 UCS-2 (UTF-16을 사용하는 것이 좋습니다)가 유니 코드와 동일하다고 생각하더라도 절대 그렇지 않습니다. UTF-16은 여러 인코딩 중 하나입니다. – Deduplicator

관련 문제