我试图将一个进程名作为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
复制相似问题
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2024 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号: 粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287