[英]Very Strange Behavior of LPCTSTR
我一直在使用FindFirstFile和FindNextFile反向搜索目錄的系統上工作,但是遇到了我不理解的問題。
下面是一個代碼片段。
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);
我正在使用Visual Studio 2008。
如您所見,除了最后一個字符和'\\'以外,其他所有字符均以亞洲字符顯示。
(注意,我的代碼不會擔心其他任何問題。)
任何想法為什么會發生將不勝感激。
這是您的問題:
searchDrive((LPCTSTR)"C:\\",(LPCTSTR)"*.bdjf");
默認情況下,Visual Studio以Unicode模式編譯程序。 因此,您要將兩個“ ANSI”(8位字符)字符串都轉換為“ Unicode”(16位字符)字符串類型。
這不會轉換字符串。 它只是告訴編譯器假裝它們一直都是Unicode字符串。 這樣做並不奇怪,這不足為奇。 結果是每對ANSI字符對都被視為一個Unicode字符。
您可以像這樣解決問題:
searchDrive(TEXT("C:\\"), TEXT("*.bdjf"));
但是,除非有特殊原因支持ANSI模式,否則最好還是使用
searchDrive(L"C:\\", L"*.bdjf");
並將searchDrive
的聲明searchDrive
為使用LPCWSTR
而不是LPCTSTR
。
更改此行:
searchDrive((LPCTSTR)"C:\\",(LPCTSTR)"*.bdjf");
對此:
searchDrive(L"C:\\", L"*.bdjf");
您也可以說TEXT("C:\\\\")
和TEXT("*.bdjf")
進行適當的字符串文字轉換。
但通常,您應該只停止使用TCHAR
,而到處都使用Unicode和長字符串。
請移除所有類型轉換,你不知道自己在做什么並能解釋為什么中投neccessary為正確的工作。 切勿-Wall -Wextra
編譯器,而要大聲疾呼:使用-Wall -Wextra
,並適當處理所有警告。
這樣做會使錯誤非常明顯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.