Я правильно конвертирую из "const char *" в "TCHAR*"?
Я пытаюсь передать имя процесса как TCHAR в следующий void:
void GetBaseAddressByName(DWORD pID, TCHAR *pN)
Делая это так:
GetBaseAddressByName(aProcs[i], (TCHAR*)"Process.exe");
Поэтому мой вопрос: правильно ли я делаю? Потому что я пробовал и TEXT("Process.exe"), и _T("Process.exe") с набором символов моего проекта на Multi-Bite и Unicode, и он просто говорит мне, что
argument of type "const char*" is incompatible with parameter of type "TCHAR*"
4 ответа
(TCHAR*)"Process.exe"
не является допустимым приведением типа. Он будет "работать", когда для charset проекта установлено значение ANSI/MBCS, но он будет создавать мусор, если для charset установлено значение 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_cast
). Вот почему вы все еще получаете ошибки при попытке использовать TEXT()
/_T()
макросы.
Краткий ответ: нет. TCHAR отображает либо char
или же wchar_t
в зависимости от Unicode/ многобайтовой настройки вашего проекта. Так что, в общем, подобный бросок либо не нужен, либо неверен. Правильный способ, как вы сказали, это использовать либо TEXT
или же _T
макро. Причина, по которой вы получаете ошибку, в том, что вы пытаетесь передать const
символьная строка для функции, которая ожидает изменяемую символьную строку. Безопасный способ обойти ошибку - скопировать вашу постоянную строку в локальный TCHAR
буфер, а затем передать это GetBaseAddressByName
,
Лучше сначала иметь массив 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");
,
Вам нужен L, как L"Process.exe"
, Строки Unicode указываются с помощью L"".
Тем не менее, нет никаких оснований использовать TCHAR. Используйте Unicode все время, только если вы работаете с Windows.