我试图将一个进程名作为TCHAR传递给下面的void:
void GetBaseAddressByName(DWORD pID, TCHAR *pN)
如下所示:
GetBaseAddressByName(aProcs[i], (TCHAR*)"Process.exe");
所以我的问题是:我所做的是正确的吗?因为我已经在多位和Unicode上用我的项目的字符集尝试了TEXT("Process.exe")和_T("Process.exe"),它只是告诉我
argument of type "const char*" is incompatible with parameter of type "TCHAR*"
发布于 2018-12-22 06:11:10
(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_cast
强制转换const
),则不能传递指向非常量数据的指针。这就是为什么在尝试使用TEXT()
/_T()
宏时仍然收到错误的原因。
发布于 2018-12-22 05:39:06
简而言之,答案是否定的。TCHAR根据项目的Unicode/多字节设置映射到char
或wchar_t
。因此,通常情况下,这样的强制转换要么是不必要的,要么是不正确的。正如您所说,正确的方法是使用TEXT
或_T
宏。出现错误的原因是您试图将一个const
字符串传递给一个需要可变字符串的函数。避免此错误的安全方法是将常量字符串复制到本地TCHAR
缓冲区中,然后将其传递给GetBaseAddressByName
。
发布于 2018-12-22 04:23:29
最好先有一个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");
。
https://stackoverflow.com/questions/53890359
复制相似问题