跳到主要内容

Win32 编程

了解 Windows 操作系统的机制以及 Windows API 的使用。

文件操作

读取文件

#include<windows.h>

int main() {
// 定义文件名或路径
const char* fileName = "file";
// 打开文件句柄
HANDLE hFile = CreateFileA(
fileName,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hFile == INVALID_HANDLE_VALUE) {
return -1;
}
// 获取文件大小
DWORD fileSize = GetFileSize(hFile, NULL);
if (fileSize == INVALID_FILE_SIZE) {
CloseHandle(hFile);
return -1;
}
// 分配内存
BYTE* buffer = (BYTE*)VirtualAlloc(NULL, fileSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
if (buffer == NULL) {
CloseHandle(hFile);
return -1;
}
// 读取文件内容至buffer
DWORD byteRead;
BOOL result = ReadFile(hFile, buffer, fileSize, &byteRead, NULL);
if (!result) {
CloseHandle(hFile);
return -1;
}
CloseHandle(hFile);
return 0;
}

资源操作

#include<windows.h>

int main() {
const char* resourceName = "";
DWORD resourceSize = 0;
HRSRC res = FindResourceA(NULL, resourceName, MAKEINTRESOURCEA(RT_RCDATA));
if (res == NULL) {
return NULL;
}

HGLOBAL resHandle = LoadResource(NULL, res);
if (resHandle == NULL) {
return NULL;
}

resourceSize = SizeofResource(NULL, res);
if (resourceSize == 0) {
return NULL;
}

BYTE* resourceData = (BYTE*)LockResource(resHandle);
if (resourceData == NULL) {
return NULL;
}

BYTE* data = (BYTE*)malloc(resourceSize);
if (data == NULL) {
return NULL;
}
memcpy(data, resourceData, resourceSize);
}

注册表操作

#include <Windows.h>

int main()
{
const char* name = "注册表键名";
const char* value = "注册表键值";
HKEY key;
LONG result;

// 创建注册表并写入
result = RegCreateKeyA(
HKEY_CURRENT_USER,
"Software\\Application",
&key
);
if (result == ERROR_SUCCESS) {
result = RegSetValueExA(
key,
name,
0,
REG_SZ,
(BYTE*)value,
strlen(value) + 1
);
}
RegCloseKey(key);

// 写入已有注册表
result = RegOpenKeyExA(
HKEY_CURRENT_USER,
"Software\\Application",
0,
KEY_READ | KEY_WRITE,
&key
);
if (result == ERROR_SUCCESS) {
result = RegSetValueExA(
key,
name,
0,
REG_SZ,
(BYTE*)value,
strlen(value) + 1
);
}
RegCloseKey(key);

// 读取注册表
result = RegOpenKeyExA(
HKEY_CURRENT_USER,
"Software\\Application",
0,
KEY_READ,
&key
);
if (result == ERROR_SUCCESS) {
DWORD size = 1024;
char* readValue = new char[size];
result = RegQueryValueExA(
key,
name,
0,
NULL,
(BYTE*)readValue,
&size
);
if (result == ERROR_SUCCESS) {
printf("value: %s", readValue);
}
}
}