如何将 PCHAR* 转换为 TCHAR*?

问题描述

我正在寻找在 Visual Studio 中没有任何警告的情况下将 PCHAR* 变量转换为 TCHAR* 的方法(这是必需的)? 在线查看我找不到没有警告的功能方法。也许有人遇到过类似的事情?

谢谢!

解决方法

PCHAR* 变量转换为 TCHAR*

  • PCHAR 是解析为 typedefchar*,所以 PCHAR* 表示 char**

  • TCHAR 是一个宏 #define 到“宽”wchar_t 或“窄”char

在这两种情况下,您都不能(安全地)在 char ** 和简单字符指针之间进行转换,因此以下假设问题实际上是关于将 PCHAR 转换为 TCHAR*

PCHAR 与 ANSI 构建中的 TCHAR* 相同,在这种情况下不需要转换,因此可以进一步假设问题与 Unicode 构建有关。

PCHAR 来自函数声明(不可更改),TCHAR 来自 GetCurrentDirectory。我想使用 _tcscat_s 连接 2,但我需要先转换 PCHAR。

窄字符串和宽字符串之间转换的一般问题之前已经回答过,例如参见 Convert char * to LPWSTRHow to convert char* to LPCWSTR?。但是,在这种特殊情况下,您可以在选择一般方法之前权衡备选方案。

  1. 将您的构建设置更改为 ANSI,而不是 Unicode,则无需转换。

    这就像确保编译时既没有定义 UNICODE 也没有定义 _UNICODE 宏一样简单,或者在 IDE 中更改项目配置属性/高级/字符集 从 Use Unicode Character SetNot SetUse Multi-Byte Character Set

    免责声明:如今针对 8 位 Windows 代码页进行编译是一种逆行。我建议它,这样做意味着许多国际字符无法按字面表示。但是,链的强度取决于其最薄弱的环节,如果您被迫使用无法更改的外部函数返回的窄字符串,那么这就限制了在其他地方使用完整 Unicode 的用处。

  2. 将构建保留为 Unicode,但只更改连接代码以使用 ANSI 字符串。

    这可以通过显式调用 API 的 ANSI 版本 GetCurrentDirectoryA 来完成,该版本返回一个窄字符串。然后你可以直接用另一个 strcat 字符串 PCHAR

  3. 保持原样,但使用 [w]printf 而不是 _tcscat_s 组合窄字符串和宽字符串。

    char szFile[] = "test.txt";
    PCHAR pszFile = szFile;                           // narrow string from ext function
    
    wchar_t wszDir[_MAX_PATH];
    GetCurrentDirectoryW(_MAX_PATH,wszDir);          // wide string from own code
    
    wchar_t wszPath[_MAX_PATH];
    wsprintf(wszPath,L"%ws\\%hs",wszDir,pszFile);  // combined into wide string