Windows Unicode相关

Posted d笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows Unicode相关相关的知识,希望对你有一定的参考价值。

====头文件前后顺序影响TCHAR定义===============================
windows.h winnt.h
tchar.h
======定义_UNICODE宏常量控制==================
//字符
typedef char TCHAR;
typedef wchar_t TCHAR;

字符串
typedef __T(x) L##x
typedef __T(x) x

//C库函数
#define _tcslen strlen
#define _tcslen wcslen
#define _tmain main
#define _tmain wmain
#define _tWinMain WinMain
#define _tWinMain wWinMain

=====定义UNICODE常量控制=========================
字符
typedef CHAR TCHAR
typedef WCHAR TCHAR
字符串
#define __TEXT(x) L##x
#define __TEXT(x) x

typedef LPSTR PTSTR, LPTSTR;
typedef LPWSTR PTSTR, LPTSTR;

//系统函数
#define MessageBox MessageBoxA
#define MessageBox MessageBoxW

=====在tchar.h中定义======================
TCHAR
__T(x)
#define _T(x) __T(x)
#define _TEXT(x) __T(x)

//C库函数
_tcslen
_tmain
_tWinMain

======在winnt.h中定义======================
//字符
TCHAR

typedef char CHAR;
typedef wchar_t WCHAR;

//字符串
__TEXT(x)
#define TEXT(x) __TEXT(x)

PTSTR, LPTSTR

补充:
mainCRTStartup()/wmainCRTStartup() 位于C运行库,它先执行,然后调用main()/wmain();
//main入口
int _tmain(void);
int _tmain(int argc, TCHAR **argv);
int _tmain(int argc, TCHAR *argv[]);
当入口点是WinMain,执行程序开始于WinMainCRTStartup,同理wWainMain,其开始在wWinMainCRTStartup
//WinMain入口
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow);

window API字符串函数
字符串长度
int WINAPI lstrlenA(LPCSTR lpString);
int WINAPI lstrlenW(LPCWSTR lpString);
拼接字符串
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2);
字符串大小写转换
LPWSTR WINAPI CharLowerW(LPWSTR lpsz);
LPWSTR WINAPI CharUpperW(LPWSTR lpsz);


MultiByteToWideChar WideCharToMultiByte

BOOL StringReverseA(PSTR pMultiByteStr)
{
PWSTR pWideCharStr;
int nLenOfWideCharStr;
BOOL fOk = FALSE;

nLenOfWideCharStr = MultiRyteToWideChar(CP_ACP, 0,pMultiByteStr, -1, NULL, 0);

pWideCharStr = HeapAlloc(GetProcessHeap(), 0, nLenOfWideCharStr * sizeof(WCHAR));

 

MultiByteToWideChar(CP_ACP, 0, pMulti8yteStr, -1, pWideCharStr, nLenOfWideCharStr);

fOk = StnngReverseW(pWideCharStr);
if (fOk)
{
//Convert the wide-character string back
//to a multibyte string.
WideCharToMultiByte(CP_ACP, 0, pWideCharStr, -1,
pMultiByteStr, strlen(pMultiByteStr), NULL, NULL);
}
HeapFree(GetProcessHeap(), 0, pWideCharStr);

return(fOk),
}


FormatMessage

//Get the error code
DWORD dwError = GetDlgItemInt(hwnd, IDC_ERRORCODE, NULL, FALSE);

//Buffer that gets the error message string
HLOCAL hlocal = NULL;

//Get the error code‘s textual description
BOOL fOk = FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL, dwError, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
(PTSTR)&hlocal, 0, NULL);

if (hlocal != NULL)
{
SetDlgItemText(hwnd, IDC_ERRORTEXT, (PCTSTR)LocalLock(hlocal));
LocalFree(hlocal);
}
else
SetDlgItemText(hwnd, IDC_ERRORTEXT,
TEXT("Error number not found."));


PTSTR GetCommandLine();
HMODULE GetModuleHandle( PCTSTR pszModule);

 

BOOL CreateProcess(
PCTSTR pszApplicationName,
PTSTR pszCommandLine,
PSECURITY_ATTRIBUTES psaProcess,
PSECURITY_ATTRIBUTES psaThread,
BOOL bInheritHandles,
DWORD fdwCreate,
PVOID pvEnvironment,
PCTSTR pszCurDir,
PSTARTUPINFO psiStartInfo,
PPROCESS_INFORMATION ppiProcInfo);
VOID GetStartupInfo(LPSTARTUPINFO pStartupInfo);
OSVERSIONINFOEX os = { 0 };
os.dwOSVersionInfoSize = sizeof(os);

GetVersionEx((LPOSVERSIONINFOA)&os);

printf("%u - %u - %u - %u - %s - %hu - %hu - %hu - %d \n",
os.dwMajorVersion,os.dwMinorVersion,os.dwBuildNumber,
os.dwPlatformId,os.szCSDVersion,
os.wServicePackMajor,os.wServicePackMinor,os.wSuiteMask,
os.wProductType);

DWORD WINAPI ThreadFunc(PVOID pvParam)
{
DWORD dwResult = 0;
...
return(dwResult);
}

HANDLE CreateThread(
PSECURITY_ATTRIBUTES psa,
DWORD cbStack,
PTHREAD_START_ROUTINE pfnStartAddr,
PVOID pvParam,
DWORD fdwCreate,
PDWORD pdwThreadID);
_beginthreadex


DWORD GetCurrentProcessId();
DWORD GetCurrentThreadId();
HANDLE GetCurrentProcess();
HANDLE GetCurrentThread();
GetProcessTimes
GetThreadTimes

__int64 FileTimeToQuadWord(PFILETIME pft)
{
return (Int64ShllMod32(
pft->dwHighDateTime, 32) | pft->dwLowDateTime);
}

GetThreadTimes

u_long argp = 1L;
int nRet = ioctlsocket(s, FIONBIO, (u_long far*)&argp); //非阻塞模式
if(nRet == SOCKET_ERROR)
return ;

#include <windows.h>
#include <tchar.h>

int _tmain(int argc, TCHAR *argv[])
{
PDWORD cChars = NULL;
HANDLE std = GetStdHandle(STD_OUTPUT_HANDLE);

if (std == INVALID_HANDLE_VALUE) {
_tprintf(L"Cannot retrieve standard output handle\n (%d)",
GetLastError());
}

WriteConsole(std, argv[1], _tcslen(argv[1]), cChars, NULL);

return EXIT_SUCCESS;
}

以上是关于Windows Unicode相关的主要内容,如果未能解决你的问题,请参考以下文章

如何在Windows命令行中使用unicode字符?

Windows 对其 Unicode 数据类型使用啥 Unicode 编码(UTF-8、UTF-16 等)?

Windows 中的 Unicode 规范化

Windows:支持哪个版本的 Unicode?

Windows程序设计中Unicode的认识

非Unicode编码的软件如何在Windows系统上运行