Строки и все , что с ними связано (TCHAR,..)
TCHAR - это изобретение Microsoft и куча проблем с ним связано. Если у вас проект на Unicode, то это TCHAR = wchar_t. Если ASCII то TCHAR = char.
#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
http://www.pvsm.ru/unicode/23896
Поскольку TCHAR в исходниках примеров драйверов повсюду надо понимать как с ним далее работать. Как следствие надо использовать Windows Safe String Function для разных преобразований:
присвоить значение TCHAR строке :
TCHAR str[100];
StringCchCopy(str, ARRAYSIZE(str), L"127.0.0.1");
/*
STRSAFEAPI StringCchCopyA(
STRSAFE_LPSTR pszDest,
size_t cchDest,
STRSAFE_LPCSTR pszSrc
);
*/
Если надо int в TCHAR преобразовать (int -> TCHAR):
TCHAR str[100];
StringCchPrintf(str, ARRAYSIZE(str), TEXT("%d"), (int)number);
присваивание значений строкам
"строка ANSI"; // ANSI
L"строка Unicode"; // Unicode
TEXT("строка ANSI|Unucode по ситуации как и с TCHAR")
_T = TEXT
LPCSTR понимается так.
• LP — Long Pointer (длинный указатель)
• C – Constant (константа)
• STR – String (строка)
По сути LPCSTR это (Длинный) указатель на строку.
LPSTR общеприменяемый префикс с названии sz
typedef char* LPSTR;
LPCWSTR,LPWSTR описан так:
typedef const WCHAR* LPCWSTR;
typedef WCHAR* LPCWSTR;
LPCTSTR
LP — Long Pointer (Длинный указатель)
C — Constant (Константа)
T = TCHAR
STR = String (Строка)
Что такое STRSAFE? Смотрим strsafe.h :
typedef __nullterminated char* STRSAFE_LPSTR;
typedef __nullterminated const char* STRSAFE_LPCSTR;
typedef __nullterminated wchar_t* STRSAFE_LPWSTR;
typedef __nullterminated const wchar_t* STRSAFE_LPCWSTR;
typedef __nullterminated const wchar_t UNALIGNED* STRSAFE_LPCUWSTR;
Там же в strsafe.h :
#ifdef UNICODE
#define StringCchCopy StringCchCopyW
#else
#define StringCchCopy StringCchCopyA
#endif // !UNICODE
#ifdef UNICODE
#define StringCchPrintf StringCchPrintfW
#else
#define StringCchPrintf StringCchPrintfA
#endif // !UNICODE
Скопировать TCHAR* в char* (универсальный вариант)
TCHAR ourIpAdress[100];
char *ipAddres = new char[256];
int cbMultiByte = WideCharToMultiByte(CP_ACP,0,ourIpAdress,sizeof(ourIpAdress),ipAddres,sizeof(ipAddres),NULL,NULL);
wcstombs(ipAddres, ourIpAdress, sizeof(ourIpAdress)); к сожалению только если UniCode исползуется