cpp
复制代码
#include <Windows.h>
// 窗口过程函数声明
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow)
{
static TCHAR szAppName[] = TEXT("Win32Window");
// 1. 窗口类注册
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(NULL, IDI_APPLICATION);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szAppName;
wcex.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
if (!RegisterClassEx(&wcex)) {
MessageBox(NULL, TEXT("Window Registration Failed!"), TEXT("Error"), MB_ICONEXCLAMATION | MB_OK);
return 0;
}
// 2. 创建窗口
HWND hWnd = CreateWindowEx(
0, // 扩展样式
szAppName, // 窗口类名
TEXT("Windows原生窗口示例"), // 窗口标题
WS_OVERLAPPEDWINDOW, // 窗口样式
CW_USEDEFAULT, CW_USEDEFAULT, // 初始位置
800, // 宽度
600, // 高度
NULL, // 父窗口
NULL, // 菜单
hInstance, // 实例句柄
NULL // 创建参数
);
if (!hWnd) {
MessageBox(NULL, TEXT("Window Creation Failed!"), TEXT("Error"), MB_ICONEXCLAMATION | MB_OK);
return 0;
}
// 3. 显示窗口
ShowWindow(hWnd, iCmdShow);
UpdateWindow(hWnd);
// 4. 消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
// 5. 窗口过程函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) {
case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// 绘制文本
RECT rect;
GetClientRect(hWnd, &rect);
DrawText(hdc, TEXT("Hello Windows!"), 14, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
EndPaint(hWnd, &ps);
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
cpp
复制代码
#include <windows.h>
#include <iostream>
#include <cassert>
int main() {
const char* sharedMemName = "Global\\MySharedMemory";
const SIZE_T sharedMemSize = 1024; // 1KB
// 创建共享内存
HANDLE hMapping = CreateFileMapping(
INVALID_HANDLE_VALUE, // 使用系统页文件
NULL, // 默认安全属性
PAGE_READWRITE, // 可读写
0, // 高位文件大小
sharedMemSize, // 低位文件大小
sharedMemName // 共享内存名称
);
if (!hMapping) {
std::cerr << "创建共享内存失败!错误代码:" << GetLastError() << std::endl;
return 1;
}
// 映射到进程地址空间
LPVOID pSharedMem = MapViewOfFile(
hMapping, // 映射对象句柄
FILE_MAP_ALL_ACCESS, // 完全访问权限
0, // 偏移高位
0, // 偏移低位
0 // 映射整个区域
);
if (!pSharedMem) {
std::cerr << "映射共享内存失败!错误代码:" << GetLastError() << std::endl;
CloseHandle(hMapping);
return 1;
}
// 写入数据到共享内存
int* pData = static_cast<int*>(pSharedMem);
pData[0] = 42; // 写入示例数据
std::cout << "写入共享内存的值:" << pData[0] << std::endl;
// 解除映射
if (!UnmapViewOfFile(pSharedMem)) {
std::cerr << "解除映射失败!错误代码:" << GetLastError() << std::endl;
}
// 关闭句柄
CloseHandle(hMapping);
// 示例:另一个进程打开已存在的共享内存
HANDLE hExistingMapping = OpenFileMapping(
FILE_MAP_ALL_ACCESS, // 完全访问权限
FALSE, // 不可继承
sharedMemName // 共享内存名称
);
if (hExistingMapping) {
LPVOID pExistingMem = MapViewOfFile(
hExistingMapping,
FILE_MAP_ALL_ACCESS,
0,
0,
0
);
if (pExistingMem) {
int* pExistingData = static_cast<int*>(pExistingMem);
std::cout << "从共享内存读取的值:" << pExistingData[0] << std::endl;
assert(pExistingData[0] == 42); // 验证数据一致性
UnmapViewOfFile(pExistingMem);
}
CloseHandle(hExistingMapping);
} else {
std::cerr << "打开共享内存失败!错误代码:" << GetLastError() << std::endl;
}
return 0;
}