我是否可以从“ const char *”正确转换为“ TCHAR *”?

时间:2018-12-21 20:14:09

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

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

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*"

4 个答案:

答案 0 :(得分:3)

简短的回答是“否”。根据项目的Unicode /多字节设置,TCHAR映射到charwchar_t。因此,通常来说,这样的转换是不必要的或不正确的。正如您所说,正确的方法是使用TEXT_T宏。出现错误的原因是,您试图将const字符串传递给需要可变字符串的函数。解决该错误的安全方法是将常量字符串复制到本地TCHAR缓冲区中,然后将其传递给GetBaseAddressByName

答案 1 :(得分:1)

最好先拥有一个TCHAR数组,然后复制到其中。

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

(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与{{1}一起使用}。这就是为什么在尝试使用const_cast / TEXT()宏时仍然出现错误的原因。