Я правильно конвертирую из "const char *" в "TCHAR *"? - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь передать имя процесса как TCHAR в следующую пустоту:

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 ]

0 голосов
/ 22 декабря 2018

(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().

0 голосов
/ 21 декабря 2018

Вам нужен L, как L"Process.exe".Строки Unicode указываются с помощью L "".

Тем не менее, нет причин использовать TCHAR.Постоянно используйте юникод, если вы работаете только в Windows.

0 голосов
/ 22 декабря 2018

Короткий ответ - нет.TCHAR соответствует либо char, либо wchar_t, в зависимости от настроек Unicode / Multi-byte вашего проекта.Так что, в общем, подобный бросок либо не нужен, либо неверен.Как вы сказали, правильный способ - использовать макрос TEXT или _T.Причина, по которой вы получаете ошибку, заключается в том, что вы пытаетесь передать const символьную строку в функцию, которая ожидает изменяемую символьную строку.Безопасный способ обойти ошибку - скопировать вашу постоянную строку в локальный буфер TCHAR, а затем передать ее в GetBaseAddressByName.

0 голосов
/ 21 декабря 2018

Лучше сначала иметь массив 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");.

...