LPCTSTR的非常奇怪的行为

时间:2014-04-06 01:36:53

标签: c++ winapi character-encoding filesystems

我一直致力于使用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。

enter image description here

你可以看到除了最后一个角色以外的所有角色和' \'无法看到,其余的都出现在亚洲人物中。

(注意不要担心我的代码有任何其他问题。)

任何关于为什么会发生这种情况的想法都会受到赞赏。

3 个答案:

答案 0 :(得分:4)

这是你的问题:

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

答案 1 :(得分:1)

更改此行:

searchDrive((LPCTSTR)"C:\\",(LPCTSTR)"*.bdjf");

对此:

searchDrive(L"C:\\", L"*.bdjf");

您也可以说TEXT("C:\\")TEXT("*.bdjf")进行相应的字符串文字转换。

但总的来说,你应该停止使用TCHAR,只使用Unicode和长字符串。

答案 2 :(得分:0)

请删除您不知道完全您正在做什么的所有演员阵容,并解释为什么演员阵容必要正确工作。永远不要扼杀编译器,而是要求它说出来:使用-Wall -Wextra,并适当地处理所有警告。

这样做会使错误显而易见。