我正在尝试将进程名称作为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*"
答案 0 :(得分:3)
简短的回答是“否”。根据项目的Unicode /多字节设置,TCHAR映射到char
或wchar_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()
宏时仍然出现错误的原因。