c++ - LPCTSTR 的非常奇怪的行为

标签 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

可以看到除了最后一个字符和'\'看不到,其余的都是亚洲字符。

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

任何关于为什么会发生这种情况的想法都将不胜感激。

最佳答案

这是你的问题:

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/

相关文章:

character-encoding - 如何将 8 位字节转换为 6 位字符?

c - QueryFullProcessImageName 因有效 HINSTANCE 失败?

c++ - Windows 图标 (LoadImage) 句柄的生命周期是多长?

c++ - 如何用 `int32_t` 值快速填充内存?

c++ - C/C++ 为什么对二进制数据使用 unsigned char?

c++ - 有没有一种方法可以初始化一个不涉及编写构造函数的新结构变量?

c++ - 从剪贴板获取文本后,需要将一个字符串插入另一个字符串的建议

c++ - C++命名空间的困扰

c++ - 为什么不构造内部类? C++

R:数据框中的重音字符