Я правильно конвертирую из "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.

Другие вопросы по тегам