【问题标题】:Am I converting properly from "const char *" to "TCHAR*"?我是否从“const char *”正确转换为“TCHAR*”?
【发布时间】:2019-05-22 06:07:19
【问题描述】:

我正在尝试将进程名称作为 TCHAR 传递给以下 void:

void GetBaseAddressByName(DWORD pID, TCHAR *pN)    

通过这样做:

GetBaseAddressByName(aProcs[i], (TCHAR*)"Process.exe");

所以我的问题是:我所做的是否正确?因为我已经在 Multi-Bite 和 Unicode 上尝试了 TEXT("Process.exe") 和 _T("Process.exe") 与我的项目字符集,它只是告诉我

argument of type "const char*" is incompatible with parameter of type "TCHAR*"

【问题讨论】:

  • "Process.exe" 是一个const char *。如果该函数试图修改内容,您的程序将崩溃。改用临时缓冲区:TCHAR temp[] = "Process.exe";
  • 除了const,您可以使用UNICODE,然后TCHAR 仍然与char 不兼容。

标签: c++ visual-studio char type-conversion tchar


【解决方案1】:

简短的回答是否定的。根据项目的 Unicode/多字节设置,TCHAR 映射到 charwchar_t。所以,一般来说,这样的演员阵容要么是不必要的,要么是不正确的。正如您所说,正确的方法是使用 TEXT_T 宏。您收到错误的原因是您试图将 const 字符串传递给需要可变字符串的函数。绕过错误的安全方法是将常量字符串复制到本地 TCHAR 缓冲区,然后将其传递给 GetBaseAddressByName

【讨论】:

    【解决方案2】:

    最好先有一个TCHAR数组,然后复制进去。

    #include "atlstr.h"
    char const *  procName = "processName.exe";
    TCHAR szName [128];
    _tcscpy(szName, A2T(procName));
    GetBaseAddressByName(aProcs[i], szName);
    

    正如@Remy Lebeau 在 cmets 中所建议的,procName 可以定义为 TCHAR const * procName = TEXT("processName.exe");

    【讨论】:

    • 本例中无需使用A2T(),只需将procName改为TCHAR const * procName = TEXT("processName.exe");,即可使用_tcscpy(szName, procName);
    【解决方案3】:

    (TCHAR*)"Process.exe" 不是有效的类型转换。当项目字符集设置为 ANSI/MBCS 时它会“工作”,但如果字符集设置为 Unicode,它会产生垃圾。

    使用TEXT("Process.exe") 是使字符串文字使用TCHAR 字符的正确方法。

    GetBaseAddressByName(aProcs[i], TEXT("Process.exe"));
    

    但是,您需要将pN 参数改为const TCHAR *(或LPCTSTR):

    void GetBaseAddressByName(DWORD pID, const TCHAR *pN);
    

    void GetBaseAddressByName(DWORD pID, LPCTSTR pN);
    

    字符串文字是 const 数据,并且您不能在需要指向非 const 数据的指针的地方传递指向 const 数据的指针(不使用 const_cast 强制转换 const)。这就是为什么您在尝试使用 TEXT()/_T() 宏时仍然遇到错误的原因。

    【讨论】:

      【解决方案4】:

      您需要一个 L,例如 L"Process.exe"。 Unicode 字符串用 L"" 指定。

      也就是说,没有理由使用 TCHAR。如果只在 Windows 上工作,请始终使用 unicode。

      【讨论】:

        猜你喜欢
        • 2019-01-05
        • 1970-01-01
        • 2011-11-02
        • 2019-09-10
        • 2013-10-18
        • 1970-01-01
        • 1970-01-01
        • 2018-11-16
        • 1970-01-01
        相关资源
        最近更新 更多