TCHAR:为了满足Unicode编码,对char的扩展,即_T(“str”)表示TCHAR类型 C++支持两种字符串,即常规的ANSI编码(使用""包裹)和Unicode编码(使用L""包裹),这样对应的就有了两套字符串字符串处理函数 ,比如:strlen和wcslen,分别用于处理两种字符串char和TCHAR类型 winnt.h头文件中: typedef WCHAR TCHAR, *PTCHAR; 表明 TCHAR ====== 应用实例:通过system函数程序调用启动msc程序 void WSUS::OnBnClickedOk() { CString strPath = NULL; // 申请路径字符串(TCHAR \"), _T("\\\\")); // 替换strPath中"\"为"\\",注意转换符 //sprintf(strChar, "%s %S", "mmc.exe", strPath); // TCHAR 转换char类型 sprintf(strChar, "mmc.exe \"%S\"", strPath); // TCHAR转换char类型 MessageBox(strPath, _T("title
其中,WCHAR 对应 wchar_t,CHAR 对应 char,TCHAR 是一种条件编译的类型,根据条件动态代表 wchar_t 或者 char。
error C2061: 语法错误: 标识符“_TCHAR”解决办法: 标识符“_TCHAR”被定义在“tchar.h”头文件中,包含该头文件即可。 #include <tchar.h> 在该头文件中定义如下: #ifndef __TCHAR_DEFINED typedef wchar_t _TCHAR; typedef wchar_t TSCHAR; typedef wchar_t _TUCHAR; typedef wchar_t _TXCHAR; typedef wint_t _TINT; #define __TCHAR_DEFINED #endif #ifndef _TCHAR_DEFINED #if ! __STDC__ typedef wchar_t TCHAR; #endif 可以看到声明类型wchar_t为 _TCHAR,wchar_t是C/C++的字符类型,是一种扩展的存储方式,wchar_t
*Expansion,TCHAR *FileName);//构造函数 ~ScanDisk(); TCHAR DriveString[MAX_PATH];// 驱动器列表 TCHAR Driver [MAX_PATH];//驱动器名 TCHAR Expansion[MAX_PATH];//后缀名 TCHAR FileName[MAX_PATH];//构造函数使用生成的文件名 TCHAR Name ();//得到驱动器列表 bool Search(TCHAR *Path,TCHAR *File);//递归搜索 bool TcharMarch(TCHAR *fileName,TCHAR *Extension ); TCHAR* ReadString(TCHAR* szSection, TCHAR* szKey, const TCHAR* szDefaultValue); private: TCHAR m_szFileName , TCHAR* szKey, TCHAR* szValue); void DeleteString(TCHAR* szSection, TCHAR* szKey); private: TCHAR
*SubKey; //欲打开注册表项的地址 TCHAR *KeyName; //欲设置项的名字 TCHAR *ValueName; //欲设置值的名称 LPBYTE SetContent_S *ReSubKey,TCHAR *ReValueName); int SetValue_S (struct HKEY__*ReRootKey,TCHAR *ReSubKey,TCHAR *ReValueName ,LPBYTE ReSetContent_S); int SetValue_D (struct HKEY__*ReRootKey,TCHAR *ReSubKey,TCHAR *ReValueName,int ReSetContent_D[256]); int SetValue_B (struct HKEY__*ReRootKey,TCHAR *ReSubKey,TCHAR *ReValueName,BYTE ReSetContent_B[256]); int DeleteKey (struct HKEY__*ReRootKey,TCHAR *ReSubKey,TCHAR *ReKeyName); int
AutoCAD system variables const TCHAR* AcadVar::adserr = _T("errno"); const TCHAR* AcadVar::cmdecho = _T("cmdecho"); const TCHAR* AcadVar::cvport = _T("cvport"); const TCHAR* AcadVar::filedia = _T ("filedia"); const TCHAR* AcadVar::snapang = _T("snapang"); const TCHAR* AcadVar::viewdir = _ T("viewdir"); const TCHAR* AcadVar::viewsize = _T("viewsize");
#include <stdio.h> #include <windows.h> #include <tlhelp32.h> #include <string> #include <tchar.h> #include #pragma comment (lib,"Psapi.lib") BOOL DosPathToNtPath(LPTSTR pszDosPath, LPTSTR pszNtPath) { TCHAR szDriveStr[500]; TCHAR szDrive[3]; TCHAR szDevName[100]; pszFullPath[MAX_PATH]) { TCHAR szImagePath[MAX_PATH]; HANDLE hProcess; if( for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe)) { TCHAR
Message this is %f"), 2.3f)); GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, FString(UTF8_TO_TCHAR szInfo, 512, lpszFormat, argList); va_end(argList); UE_LOG(LogTemp, Warning, TEXT("%s"), UTF8_TO_TCHAR (szInfo))); UE_LOG(LogTemp, Error, TEXT("%s"), UTF8_TO_TCHAR(szInfo)); } }; 2.2. UE的字符串类FString管理的是TCHAR字符串,TCHAR是char与wchar_t的封装,在ANSI本地编码中是char,在Unicode国际化编码中是wchar_t。 UTF8_TO_TCHAR宏会将UTF8字符串转换成TCHAR字符串。这段输出打印代码如果要输出中文,需要把代码文件的编码更改为UTF8编码。
: 当没有定义_UNICODE宏时,TCHAR = char,_tcslen =strlen 当定义了_UNICODE宏时,TCHAR = wchar_t , _tcslen = wcslen 当我们定义了 这个时候,TCHAR就会摇身一变,变成了wchar_t。而未定义UNICODE宏时,TCHAR摇身一变,变成了unsignedchar。这样就可以很好的切换宽窄字符集。 tchar可用于双字节字符串,使程序可以用于中日韩等国 语言文字处理、显示。使编程方法简化。 TCHAR 就是当你的字符设置为什么就是什么。 TCHAR是定义在该头文件中的宏,它视你是否定义了_UNICODE宏而定义成: 定义了_UNICODE: typedef wchar_t TCHAR ; 没有定义_UNICODE: typedef char TCHAR ; #ifdef UNICODE typedef char TCHAR; #else typede wchar_t TCHAR; #endif _T( )也是定义在该头文件中的宏
在TCHAR.H文件中,会根据_UNICODE宏是否定义来实现字符编码及其操作接口的自适应,如,在该文件中,对于CHAR的定义是这样的,当定义的_UNICODE宏是 typedef wchar_t TCHAR ,当没有定义时 typedef char TCHAR,所以,当我们在定义字符串或字符时,只需要使用TCHAR来代替char,就能实现多字节与宽字符环境自适应的字符定义了。 另外一点,TCHAR.H中,也针对_UNICODE宏是否定义,实现了一套自适应编码环境的字符操作接口,所以建义在进行ARX编程时,如果需要多版本的支持,一定要使用TCHAR.H中定义的字符操用接口。 最后把一常用需要注意的和代替的方法贴出来: 1.字符串类型尽量用CString 2.字符类型使用 TCHAR 3.字符串数组用 TCHAR[] 4.字符串指针用 TCHAR* 5.常量字符串指针用 //要加_T 2>LPTSTR 等等被多次嵌套定义过的宏尽量少用,用基础类型 const TCHAR*(或TCHAR*)替代; 3>为TCHAR*类型指针分配 N-1 个字符的空间: TCHAR*
********************************************************************************** Function: TCHAR2STRING Description: TCHAR转string Input: str:待转化的TCHAR*类型字符串 Return: 转化后的string类型字符串 (TCHAR* str) { std::string strstr; try { int iLen = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL path[255]; SHGetSpecialFolderPath(0, path, CSIDL_PROFILE, 0); std::string rlt = TCHAR2STRING(path) (0, path, CSIDL_DESKTOPDIRECTORY, 0); std::string rlt=TCHAR2STRING(path); return rlt; } //获取程序exe所在路径
//出发地 12 TCHAR Destination[16]; //目的地 13 TCHAR Date[16]; //出发日期 14 TCHAR TakeOff_Time[16]; //起飞时间 15 TCHAR Landing_Time //航班号 58 TCHAR Departure[16]; //出发地 59 TCHAR Destination[16] ; //目的地 60 TCHAR Date[16]; //出发日期 61 TCHAR TakeOff_Time[16]; //起飞时间 62 TCHAR Landing_Time
大家好,又见面了,我是你们的朋友全栈君 查找指定窗口 TCHAR szTitle[MAX_PATH] = {0}; HWND hwnd = ::FindWindow NULL,TEXT("窗口没有找到"),TEXT("[ERROR]"),MB_OK); } 窗口控制 TCHAR ::MessageBox(NULL,TEXT("窗口没有找到"),TEXT("[ERROR]"),MB_OK); } TCHAR 枚举子窗口 BOOL CALLBACK EnumChildProc(HWND hWnd,LPARAM lParam) { TCHAR return true; } VOID EnumChildWindow() { TCHAR
通过 Windows 提供给我们的宏 TCHAR 就可以实现我们这个需求。 _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { TCHAR 其实 TCHAR 和 _T() 都是宏,他们的定义如下(参考上面发的几篇文章连接): #ifdef UNICODE typedef WCHAR TCHAR; #else typedef char TCHAR 如果是 UNICODE 字符集,则 TCHAR 就是 WCHAR(wchar_t),如果不是 UNICODE 字符集,则 TCHAR 就是 char。 图片 图中 TCHAR.H 的版本就是我们需要的版本,我们可以看到有 TCHAR.H 下面有三个函数,我们只关心第一个就可以,后面两个不在本文的介绍范围内,如果你需要了解可以看看页面中的介绍。
#include "stdafx.h" #include "Ntsecapi.h" DWORD GetStrWithPSID(PSID pSid, TCHAR* szBuffer, int nLength ); int _tmain(int argc, _TCHAR* argv[]) { PLUID pSessions; NTSTATUS ntStatus; // 验证 SID 是否有效 if (pSessionData && IsValidSid(pSessionData->Sid)) { TCHAR szUserName[MAX_PATH] = {0}; TCHAR szSID[MAX_PATH] = {0}; // 拷贝并打印用户名信息,该结构体中有很多成员 dwTopAuthority = psia->Value[5]; _stprintf_s(szBuffer, nLength, _T("S-1-%lu"), dwTopAuthority); TCHAR
调用确实可以实现这个功能,但是会出现一个很讨厌的黑色弹框,所以使用CreateProcess的方法; 执行cmd.exe命令不弹出对话框的方法: static void TcharToChar(const TCHAR * tchar, char* _char) { int iLength; //获取字节长度 iLength = WideCharToMultiByte(CP_ACP, 0, tchar, -1, NULL, 0, NULL, NULL); //将tchar值赋给_char WideCharToMultiByte(CP_ACP, 0, tchar, -1, _char, iLength , NULL, NULL); } //同上 static void CharToTchar(const char* _char, TCHAR* tchar) { int iLength; iLength , 0, _char, strlen(_char) + 1, NULL, 0); MultiByteToWideChar(CP_ACP, 0, _char, strlen(_char) + 1, tchar
szDesKeyItem, 0, KEY_READ, &hSubKey); // 打开注册表 if(ERROR_SUCCESS == lResult) { TCHAR szKeyName[256] = { 0 }; DWORD cbName = 256*sizeof(TCHAR); lResult = RegEnumKeyEx s_name[256] = {0}; // 软件名 TCHAR s_DisplayName[256] = {0}; // 显示名称 TCHAR s_Publisher[256] = {0}; // 发布者 TCHAR s_InstallDate[12] = {0}; // 安装日期 DWORD s_EstimatedSize; // 大小 TCHAR s_DisplayVersion[256] = { 0 }; // 版本 DWORD cbName = 256*sizeof(TCHAR); DWORD cbName2 = sizeof(TCHAR
>> JsonReader = TJsonReaderFactory<TCHAR>::Create(UTF8_TO_TCHAR(oauthbearerConfig.c_str())); // Declare \n" + oauthbearerConfig; UE_LOG(LogKafkaProducer, Error, TEXT("%s"), UTF8_TO_TCHAR(errmsg.c_str()) \n" + oauthbearerConfig; UE_LOG(LogKafkaProducer, Error, TEXT("%s"), UTF8_TO_TCHAR(errmsg.c_str()) \n" + oauthbearerConfig; UE_LOG(LogKafkaProducer, Error, TEXT("%s"), UTF8_TO_TCHAR(errmsg.c_str()) \n" + oauthbearerConfig; UE_LOG(LogKafkaProducer, Error, TEXT("%s"), UTF8_TO_TCHAR(errmsg.c_str())
LOAD_DLL_DEBUG_INFO* pDebug) { //printf("基址: 0x%-8X --> ", pDebug->lpBaseOfDll); BOOL bSuccess = FALSE; TCHAR (GetMappedFileName(GetCurrentProcess(), pMem, pszFilename, MAX_PATH)) { TCHAR if (GetLogicalDriveStrings(4096 - 1, szTemp)) { TCHAR szName[MAX_PATH]; TCHAR szDrive[3] = TEXT(" :"); BOOL bFound = FALSE; TCHAR* p = szTemp; do {
, sizeof(moudlename)); dret = GetLongPathName(moudlename, moudlename, sizeof(moudlename)); TCHAR 获取一个环境变量 DWORD len = GetEnvironmentVariable(TEXT("一个环境变量名"), nullptr, 0); PTSTR pszvalue = new TCHAR //扩展环境变量字符串 len = ExpandEnvironmentStrings(pszvalue, nullptr, 0); PTSTR pszvalue2 = new TCHAR 一个环境变量名"), nullptr);//删除 //工作目录 len = GetCurrentDirectory(0, nullptr); PTSTR dir = new TCHAR [len]; GetCurrentDirectory(len, dir); delete[] dir; dir = nullptr; dir = new TCHAR[_