簡體   English   中英

LPCTSTR的非常奇怪的行為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM