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