我一直致力于使用 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
的声明以使用 LPCWSTR
而不是 LPCTSTR
。
关于c++ - LPCTSTR 的非常奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22888996/