繁体   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