LPSTR, LPWSTR, TCHAR, char*, ...

фотка 1

Строки и все , что с ними связано (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 исползуется