Аргумент типа char* несовместим с параметром типа tchar*

DWORD gamebaseadress1 = GetModuleBaseAddress(_T(gamemmodule1), pID);

ошибка в (_T


Ответы (1 шт):

Автор решения: KoVadim

Давайте посмотрим, а что же делает этот _T(...). Для этого возьмем подчищенный код с библиотеки

#ifdef _UNICODE 
 #define _T(c) L##c
 #define TEXT(c) L##c
#else 
 #define _T(c) c
 #define TEXT(c) c
#endif

То есть, грубо говоря, если определен макрос _UNICODE, то _T(word) заменяется на Lword. Странно, да? нет, просто в плюсах есть конструкция L"text", для того, что бы подсказать компилятору, что текст в кавычках это не const char*, const wchar_t*. Что же будет, если туда подсунуть просто какую то переменную типа char*? а ничего хорошего. При компиляции с отключенным _UNICODE, оно будет работать, а с включенным (это 99% современного кода), будет ошибка.

Как исправлять?

если тип у gamemmodule1 wchar_t*, то можно просто написать

DWORD gamebaseadress1 = GetModuleBaseAddress(gamemmodule1, pID);

или даже так (как по мне, то если не нужно заморачиваться на старый код без поддержки юникода, то это самый простой вариант):

DWORD gamebaseadress1 = GetModuleBaseAddressW(gamemmodule1, pID);

Если же тип char*, то можно по быстрому так

DWORD gamebaseadress1 = GetModuleBaseAddressA(gamemmodule1, pID);

Но лучше имя модуля сразу получать в wchar_t*. или преобразовать.

А ещё лучше, хотя это и сложно, поддержать тип TCHAR* - это такой тип, который также зависит от _UNICODE и разворачивается в char* или wchar_t* или заморочится с конвертированием, но это нудно. Проще сразу в юникод стиле делать.

На почитать https://habr.com/ru/post/164193/

→ Ссылка