- 公开视频 -> 链接点击跳转公开课程
- 博客首页 -> 链接点击跳转博客主页
目录
数据类型
基本数据类型
Win32基本数据类型
错误处理
C语言中的错误处理
C++中的错误处理
Win32中的错误处理
字符处理
C/C++
WIN32
字符处理
数据类型
-
基本数据类型
-
C/C++语言定义了一系列的基本数据类型,语言标准保证了它们的最小大小。
-
Win32 API定义了自己的一套数据类型,这些数据类型的大小在所有Windows平台上都是固定的,从而确保了应用程序的兼容性。
-
-
Win32基本数据类型
-
确保平台兼容性:Windows操作系统在不同的平台(比如32位和64位)上有不同的实现细节。使用Win32 API定义的数据类型可以确保应用程序在这些平台上具有一致的行为。
-
提高代码的可移植性:当你的代码需要在不同的Windows版本之间移植时,使用Win32 API的数据类型可以减少因为数据类型大小差异导致的问题。
-
增强代码的阅读性和可维护性:通过使用明确定义的数据类型,代码的可读性会提高,同时也便于维护和更新。
-
满足API调用要求:许多Win32 API函数要求使用特定的数据类型作为参数,或者返回这些类型的数据。使用正确的数据类型是调用这些函数的前提。
-
大小明确:Win32 API中的数据类型如
INT32
,UINT32
,INT64
,UINT64
等明确指定了数据类型的大小,而C/C++标准中的int
,long
等类型的大小则可能根据编译器和目标平台的不同而变化。 -
类型命名:Win32 API倾向于使用全大写字母来命名数据类型(例如,
DWORD
,HANDLE
),而C/C++的数据类型命名通常是小写的(如int
,float
)。 -
布尔类型:C语言原生并不支持布尔类型(直到C99引入
_Bool
),而C++中有bool
类型。Win32 API使用BOOL
类型,通常是通过定义为int
类型来实现的。 -
特殊用途类型:Win32 API定义了一系列特殊用途的数据类型,如
HANDLE
,HWND
,HINSTANCE
等,这些是用于特定Windows资源管理的抽象类型,C/C++标准中没有对应的类型。
-
错误处理
-
C语言中的错误处理
-
C语言的错误处理较为基础,通常依赖于函数返回值和一些全局变量来传递错误信息。
-
函数返回值
-
返回负数,如
-1
,表示函数执行失败。 -
返回
NULL
指针,表示无法执行操作(如内存分配失败)。
-
-
全局变量
errno
void OpenFileByC(const char* szFilePath) { FILE* pFile = NULL; fopen_s(&pFile, szFilePath, "r"); if (pFile == NULL) { perror("fopen_s"); } }
- 当C标准库函数发生错误时,往往会设置一个全局变量
errno
,该变量在<errno.h>
中定义。 -
perror()
:输出一条错误消息到标准错误,描述最后一次错误。 -
strerror()
:返回一个指向错误文本消息的指针,这个消息对应于errno
的当前值。
- 当C标准库函数发生错误时,往往会设置一个全局变量
-
-
C++中的错误处理
-
C++提供了比C更丰富的错误处理机制,包括返回值、异常(exception)处理等。
-
函数返回值
- C++同样可以使用返回值来表示错误,方法和C类似,但是这种方式在C++中通常不是首选。
-
异常处理
void OpenFileByCPP(const char* szFilePath) { std::ifstream inFileStream(szFilePath); if (!inFileStream) { throw std::runtime_error("OpenFileByCPP"); } }
- C++引入了异常处理机制,允许在检测到错误时抛出一个异常,并在程序的其他部分捕获并处理该异常。
-
-
Win32中的错误处理
-
函数返回值
-
Win32函数经常返回一个指示成功或失败的值,如
BOOL
类型的函数通常在成功时返回非零,在失败时返回零。 -
NULL
,FALSE
,INVALID_HANDLE_VALUE
-
-
函数错误码
-
当Win32 API函数失败时,可以调用
GetLastError()
来检索扩展的错误信息。 -
SetLastError()
用于设置调用线程的最后错误代码。
-
-
错误处理函数
-
FormatMessage()
:将GetLastError()
返回的错误代码转换为可读的文本消息。 -
MessageBox()
:可以用来显示错误消息或其他信息。 -
#include <iostream> #include <Windows.h> VOID PrintfLastError() { DWORD dwError = GetLastError(); LPVOID lpBuffer = NULL; FormatMessageA( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwError, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), (LPSTR)&lpBuffer, 0, NULL); std::cout << "ErrorCode -> " << dwError << std::endl; std::cout << "ErrorMesg -> " << (LPSTR)lpBuffer << std::endl; LocalFree(lpBuffer); } VOID TerminateProcessByPid(DWORD dwPid) { //进程句柄 HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid); if (hProcess == NULL) { std::cerr << "OpenProcess Failed" << std::endl; PrintfLastError(); return; } //结束进程 BOOL bIsTerminate = TerminateProcess(hProcess, 0); if (bIsTerminate == NULL) { std::cerr << "TerminateProcess Failed" << std::endl; PrintfLastError(); return; } //关闭句柄 CloseHandle(hProcess); } int main() { DWORD dwProcessId = 0; std::cout << "Please Input Process Id to Terminate: "; std::cin >> dwProcessId; TerminateProcessByPid(dwProcessId); return 0; }
-
-
字符处理
-
C/C++
-
char
:在ASCII编码中使用。用于表示单个字节。strlen
,strcpy
,strcat
,strcmp
等:这些函数用于处理以null结尾的char
字符串。
-
wchar_t
:用于Unicode字符串。用于表示两个字节。wcslen
,wcscpy
,wcscat
,wcscmp
等:这些宽字符版本的函数用于处理wchar_t
类型的字符串。
-
-
WIN32
-
Win32 API支持两种字符集:ANSI和Unicode。根据定义
UNICODE
宏和编译选项,相同的函数名可以处理char
类型或wchar_t
类型的字符串。-
CHAR
:一个字节的ANSI字符。 -
lstrlen
,lstrcpy
,lstrcat
,lstrcmp
等:用于处理CHAR
类型的字符串。 -
WCHAR
:二个字节的Unicode字符。 -
lstrlenW
,lstrcpyW
,lstrcatW
,lstrcmpW
等:这些是处理WCHAR
类型的字符串的宽字符版本函数。
-
-
为了编写在ANSI和Unicode之间可以灵活切换的代码,Win32提供了一个名为
tchar.h
的头文件,它定义了通用的宏和类型映射。-
TCHAR
:映射到CHAR
或WCHAR
,取决于是否定义了UNICODE
。 -
_tcslen
,_tcscpy
,_tcscat
,_tcscmp
等:这些宏根据编译选项映射到对应的ANSI或Unicode函数。 -
TEXT(STR);
-
-
注意事项
-
编写Win32程序时,推荐默认使用Unicode(即定义
UNICODE
宏)。这能更好地支持多语言,并且是现代Windows应用的最佳实践。 -
和C/C++标准库一样,Win32 API中的一些字符串处理函数也存在安全风险。应优先使用它们的安全版本(例如,使用
StringCchCopy
而不是lstrcpy
)。
-
-
-
字符处理
-
字符串复制和连接
-
ANSI:
lstrcpy
,lstrcat
-
Unicode:
lstrcpyW
,lstrcatW
-
-
字符串长度
-
ANSI:
lstrlen
-
Unicode:
lstrlenW
-
-
字符串比较
-
ANSI:
lstrcmp
,lstrcmpi
(不区分大小写) -
Unicode:
lstrcmpW
,lstrcmpiW
-
-
字符转换
-
MultiByteToWideChar
-
用于将ANSI字符串转换为Unicode字符串。
-
WideCharToMultiByte
-
用于将Unicode字符串转换为ANSI字符串。
-
#include <windows.h> #include <stdio.h> int main() { // ANSI到Unicode的转换 char* ansiStr = "Hello, World!"; wchar_t unicodeStr[50]; MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, unicodeStr, 50); wprintf(L"ANSI to Unicode: %ls\n", unicodeStr); // Unicode到ANSI的转换 char convertedAnsiStr[50]; WideCharToMultiByte(CP_ACP, 0, unicodeStr, -1, convertedAnsiStr, 50, NULL, NULL); printf("Unicode to ANSI: %s\n", convertedAnsiStr); return 0; }
-
-