一、常见的Windows函数返回值的数据类型
类型 | 函数调用失败的值 |
VOID | 这个函数不可能失败。只有极少数Windows函数的返回值类型是VOID |
BOOL | TRUE系统定义的宏,为1;FALSE为0。调用失败返回0;调用成功返回1。最稳妥的是检查是否不为FALSE。 |
HANDLE | r如果函数失败,则返回值通常为NULL,否则HANDLE将标识一个可以操纵的对象。某些函数会返回INVALID_HANDLE_VALUE的句柄值,它为-1。 |
PVOID | h函数失败返回NULL,否则PVOID将标识一个数据块的内存地址。 |
LONG/DWORD | h函数的返回值通常为LONG或DWORD,如果出于某种原因不能对我们想要计数的东西进行计数,它通常会返回0或-1。 |
二、GetLastError():返回由上一个函数调用设置的线程32位错误码
注:函数失败后应该马上调用GetLastError(),因为如果不是这样可能错误码会被覆盖。
DWORD FormatMessage()将错误码转换为相应的错误文本
SetLastError(DWORD dwErrCode):设置错误码
三、字符串处理
1.多字节转换为宽字节
int MultiByteToWideChar();
使用步骤:PSTR Multibyte;
(1)int ret = MultiByteToWideChar(CP_ACP,0,Multibyte,-1,NULL,0); //返回Multibyte字符数;
(2)分配一块内存接收转换后的Unicode,大小为sizeof(wchar_t)*ret;PWSTR WideChar = (PWSTR)HeapAlloc(GetProcessHeap(),0,ret*sizeof(wchar_t)); //堆区申请内存
(3) MultiByteToWideChar(CP_ACP,0,Multibyte,ret*sizeof(wchar_t),WideChar,ret);
2.宽字节转换为多字节
int WideCharToNultiByte();
使用步骤同上。
3.判断文件是否是Unicode
BOOL IsTextUnicode(文件句柄,文件字节数,NULL); //NULL表示执行所有测试
三、内核对象
1.系统的内核对象
如事件对象、互斥量、信号量、可等待计时器、文件、文件映射、IO完成端口、作业、进程、线程、线程池、管道、邮槽等。
2.句柄
内核对象的句柄是和进程相关的。在一个进程中创建内核对象获得的句柄传到另一个进程中使用可能会失败。句柄置相当于一个内核对象的索引。
3.使用计数
内核对象是操作系统的,不是进程的。内核对象的生命周期可能比创建他的进程长。所有内核对象都包含一个使用计数,刚创建一个内核对象时使用计数是1,另一个进程对该对象进行访问后,使用计数加1,使用他的进程终止使用计数减1,减为0的时候操作系统会销毁该对象。
4.跨进程共享内核对象
(1)使用对象句柄继承
只有进程之间有父-子关系的时候才可以使用。句柄继承只发生在生成子进程的时候。
setHandleInformation():可以改变内核对象句柄继承标志。
(2)为对象命名
(3)复制对象句柄
DuplicateHandle();通常在只涉及两个进程的时候才会调用DuplicateHandle()。
例如:
HANDLE hObjInProcessS = CreateMutex(NULL,FALSE,NULL);
HANDLE hProcessT = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessIdT);
HANDLE hObjInProcessT;
DiplicateHandle(GetCurrentProcess(),hObjInProcessS,hProcessT,&hObjInProcessT,0,FALSE,DUPLICATE_SAME_ACCESS);