一、lpcwstr是什么?
lpcwstr是Windows下用来表示Unicode字符串的数据类型,其定义如下:
typedef const wchar_t* LPCWSTR;
由此可以看出,lpcwstr其实就是一个指向wchar_t类型的const指针,也就是常量宽字符类型指针。 宽字符是指使用wchar_t类型表示的字符,一个wchar_t类型通常占两个字节,与ASCII码不同,它支持更多的字符集。
二、lpcwstr的使用
在Windows编程中,lpcwstr一般用于表示资源ID、函数参数等需要传递Unicode字符串的地方。比如,在创建窗口时,需要指定窗口类名和窗口标题,这两个参数就是lpcwstr类型。 Windows API中提供了一些函数来处理lpcwstr类型的字符串,比如:
bool CreateDirectoryW(
LPCWSTR lpPathName, // 目录名
LPSECURITY_ATTRIBUTES lpSecurityAttributes // 安全属性
);
HWND CreateWindowExW(
DWORD dwExStyle, // 窗口扩展样式
LPCWSTR lpClassName, // 窗口类名
LPCWSTR lpWindowName, // 窗口标题
DWORD dwStyle, // 窗口样式
int x, // 窗口水平坐标
int y, // 窗口垂直坐标
int nWidth, // 窗口宽度
int nHeight, // 窗口高度
HWND hWndParent, // 父窗口句柄
HMENU hMenu, // 菜单句柄
HINSTANCE hInstance, // 实例句柄
LPVOID lpParam // 附加参数
);
可以看到,这些函数的参数中都出现了lpcwstr类型的字符串。使用时,只需要传入一个Unicode编码的字符串即可。
三、lpcwstr与char*的区别
在Windows编程中,有时候需要使用char类型的字符串,这里简单介绍一下和lpcwstr的区别。 首先,char类型的字符串是用来表示ANSI字符串的,在Windows中,ANSI字符串通常使用默认的本地代码页(locale)进行编码,与当前用户的语言相关。而Unicode字符串就没有这个问题,它采用的是统一的编码方式,不受语言环境的影响。 其次,由于lpcwstr表示的是const指针,所以不能直接修改其指向的字符串,而char*类型的字符串可以修改。这就是为什么在修改一个lpcwstr类型的字符串时,要先将其拷贝到一个wchar_t类型的数组中,再进行修改。
四、lpcwstr的实例代码
下面是一个使用lpcwstr类型的程序,它演示了如何创建一个窗口并显示一个Unicode字符串。
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
LPCWSTR szTitle = L"Hello, World!";
LPCWSTR szWindowClass = L"win32demo";
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, IDI_APPLICATION);
if (!RegisterClassEx(&wcex))
{
MessageBox(NULL, L"窗口注册失败!", L"错误", MB_ICONERROR);
return 0;
}
HWND hWnd = CreateWindowEx(0, szWindowClass, szTitle,
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 500, NULL, NULL,
hInstance, NULL);
if (!hWnd)
{
MessageBox(NULL, L"窗口创建失败!", L"错误", MB_ICONERROR);
return 0;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
TextOut(hdc, 10, 10, L"Hello, Windows!", 16);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
break;
}
return 0;
}