在 Windows 编程中,尤其是使用 Win32 API 时,常见的数据类型包括:
1. 整型类型
BYTE
: 8 位无符号整数,范围是 0 到 255。SHORT
: 16 位有符号整数,范围是 -32,768 到 32,767。WORD
: 16 位无符号整数,范围是 0 到 65,535。DWORD
: 32 位无符号整数,范围是 0 到 4,294,967,295。LONG
: 32 位有符号整数,范围是 -2,147,483,648 到 2,147,483,647。LONGLONG
: 64 位有符号整数,范围是 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。ULONG
: 32 位无符号整数,等同于DWORD
。ULONGLONG
: 64 位无符号整数,等同于LONGLONG
。
2. 字符类型
CHAR
: 8 位字符,通常用于 ASCII 字符。WCHAR
: 16 位字符,通常用于 Unicode 字符。TCHAR
: 根据编译环境的设置(例如_UNICODE
宏)可以是char
或wchar_t
,用于编写可以在 ANSI 和 Unicode 模式下编译的代码。
3. 布尔类型
BOOL
: 32 位布尔值,通常是TRUE
或FALSE
。在 Windows API 中,BOOL
实际上是一个 32 位的整数类型,TRUE
和FALSE
分别对应 1 和 0。
4. 指针类型
LPVOID
: 指向任意类型的指针,通常用于函数参数或返回值,允许处理不同类型的数据。LPCVOID
: 指向常量的LPVOID
,表示只读内存区域。LPSTR
: 指向字符数组的指针,用于 ANSI 字符串。LPCSTR
: 指向常量字符数组的指针,用于 ANSI 字符串。LPWSTR
: 指向宽字符数组的指针,用于 Unicode 字符串。LPCWSTR
: 指向常量宽字符数组的指针,用于 Unicode 字符串。
5. 句柄类型
HANDLE
: 通用的句柄类型,用于表示对象的引用,如文件、窗口、进程等。具体类型通常需要强制转换为正确的类型(如HANDLE
、HWND
、HINSTANCE
等)。
6. 其他类型
DWORD_PTR
: 适用于指针或整数的无符号数据类型,其大小根据平台(32 位或 64 位)不同。LONG_PTR
: 适用于指针或整数的有符号数据类型,其大小根据平台(32 位或 64 位)不同。SIZE_T
: 用于表示对象大小的类型,其大小根据平台(32 位或 64 位)不同。SSIZE_T
: 与SIZE_T
类似,但为有符号类型,用于表示可能为负的大小值。
这些类型定义在 Windows 的头文件中,如 <windows.h>
,可以方便地用于各种系统级编程任务。
------------
The C Standard Library provides a collection of functions, macros, and types that simplify common programming tasks. It is divided into several header files, each offering different functionalities. Here’s a quick overview:
<stdio.h>
: Functions for input and output (e.g.,printf
,scanf
,fopen
).<stdlib.h>
: Utilities for memory allocation, process control, and conversions (e.g.,malloc
,free
,exit
).<string.h>
: String manipulation functions (e.g.,strcpy
,strlen
,strcmp
).<math.h>
: Mathematical functions (e.g.,sqrt
,pow
,sin
).<ctype.h>
: Character classification and conversion (e.g.,isalpha
,toupper
).<time.h>
: Time and date functions (e.g.,time
,localtime
,strftime
).<limits.h>
: Limits of integer types (e.g.,INT_MAX
,CHAR_BIT
).<float.h>
: Limits of floating-point types (e.g.,FLT_MAX
,DBL_EPSILON
).<assert.h>
: Debugging aids (e.g.,assert
).<errno.h>
: Error handling (e.g.,errno
,perror
).<locale.h>
: Locale-specific information (e.g.,setlocale
,localeconv
).<stdarg.h>
: Handling variable argument lists (e.g.,va_list
,va_start
).<signal.h>
: Signal handling (e.g.,signal
,raise
).<stdnoreturn.h>
: Specifies functions that do not return (e.g.,noreturn
).
These headers and their functions help manage tasks like memory management, file operations, mathematical computations, and more, providing a foundation for C programming.
-----------
Windows API 的头文件包括了各种功能模块。以下是一些常用的头文件及其功能:
-
windows.h
:包含了基本的 Windows API 函数、数据类型和宏。几乎所有的 Windows 应用程序都需要这个头文件。 -
winuser.h
:定义了与窗口、消息和用户界面相关的函数和数据类型。 -
winbase.h
:提供了基本的 Windows 基础函数,如文件操作、进程管理等。 -
winsock2.h
:用于网络编程,包含了与套接字(Socket)相关的函数和数据类型。 -
shellapi.h
:提供了与 Windows Shell 相关的函数和数据类型。 -
commctrl.h
:定义了常用控件的函数和消息,如按钮、列表框等。 -
processthreadsapi.h
:包含了进程和线程管理相关的函数。
这些头文件通常由 windows.h
自动包含,但你也可以根据需要单独包含它们。如果你使用特定功能或模块时,确保包含相应的头文件。
------------------------
#include <windows.h>
#include <stdio.h>int main() {HKEY hKey;LONG result;char value[256];DWORD valueLength = sizeof(value);// 打开注册表键result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0, KEY_READ, &hKey);if (result != ERROR_SUCCESS) {printf("无法打开注册表键。错误代码: %ld\n", result);return 1;}// 查询注册表值result = RegQueryValueEx(hKey, "ProductName", NULL, NULL, (LPBYTE)value, &valueLength);if (result == ERROR_SUCCESS) {printf("Windows 产品名称: %s\n", value);} else {printf("无法读取注册表值。错误代码: %ld\n", result);}// 关闭注册表键RegCloseKey(hKey);return 0;
}
#include <windows.h>
#include <stdio.h>void list_files(const char *path) {WIN32_FIND_DATA findFileData;HANDLE hFind = FindFirstFile(path, &findFileData);if (hFind == INVALID_HANDLE_VALUE) {// Correct format specifier for DWORD (unsigned long)printf("FindFirstFile failed (%lu)\n", (unsigned long)GetLastError());return;}do {// 检查文件是否是目录if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {printf("Directory: %s\n", findFileData.cFileName);} else {printf("File: %s\n", findFileData.cFileName);}} while (FindNextFile(hFind, &findFileData) != 0);FindClose(hFind);
}int main() {list_files("C:\\Users\\Administrator\\Documents\\*"); // 使用 * 列出所有文件和目录return 0;
}// WIN32_FIND_DATA 结构体定义
// typedef struct _WIN32_FIND_DATA {
// DWORD dwFileAttributes; // 文件的属性
// FILETIME ftCreationTime; // 文件的创建时间
// FILETIME ftLastAccessTime; // 文件的最后访问时间
// FILETIME ftLastWriteTime; // 文件的最后写入时间
// DWORD nFileSizeHigh; // 文件大小的高32位
// DWORD nFileSizeLow; // 文件大小的低32位
// DWORD dwReserved0; // 保留字段
// DWORD dwReserved1; // 保留字段
// TCHAR cFileName[MAX_PATH]; // 文件名
// TCHAR cAlternateFileName[14]; // 文件的备用名称
// } WIN32_FIND_DATA;// 字段说明
// dwFileAttributes:
// 文件或目录的属性标志。可以是下列之一(或其组合):
// FILE_ATTRIBUTE_DIRECTORY:这是一个目录。
// FILE_ATTRIBUTE_ARCHIVE:文件已更改,自上次备份以来。
// FILE_ATTRIBUTE_HIDDEN:文件是隐藏文件。
// FILE_ATTRIBUTE_READONLY:文件是只读的。
// FILE_ATTRIBUTE_SYSTEM:文件是系统文件。
// FILE_ATTRIBUTE_NORMAL:文件没有其他属性(除了存储和读/写访问)。
// ftCreationTime:
// 文件或目录的创建时间。类型为 FILETIME 结构体,用于表示日期和时间。
// ftLastAccessTime:
// 文件或目录的最后访问时间。类型为 FILETIME 结构体。
// ftLastWriteTime:
// 文件或目录的最后写入时间。类型为 FILETIME 结构体。
// nFileSizeHigh 和 nFileSizeLow:
// 文件的大小。由于文件大小可能大于 2GB,因此它被分为高 32 位 (nFileSizeHigh) 和低 32 位 (nFileSizeLow)。
// dwReserved0 和 dwReserved1:
// 保留字段,通常不需要使用或设置这些字段。
// cFileName:
// 文件的名称。这个字段是一个数组,最大长度为 MAX_PATH(通常为 260 个字符)。
// cAlternateFileName:
// 文件的备用名称,通常用于 DOS 兼容性。这个字段的长度为 14 个字符。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>int main() {// 使用 <stdio.h> 的函数printf("Hello, World!\n");// 使用 <stdlib.h> 的函数// Allocate memory for a character array instead of an integer arraychar *arr = (char *)malloc(100 * sizeof(char)); // Allocate memory for a stringif (arr == NULL) {printf("Memory allocation failed\n");return 1;}// 使用 <string.h> 的函数strcpy(arr, "Example string");printf("String: %s\n", arr);// 使用 <math.h> 的函数double result = sqrt(25.0);printf("Square root of 25 is: %f\n", result);// 释放内存free(arr);return 0;
}