windows编程一些小知识
1.Unicode字符。 以一个内建的数据类型wchar_t,以其来表示16位的Unicode(UTF-16)字符。 eg:wchar_t c=L'A';
在WinNT.h中定义有: typedef char CHAR;//An 8-bit character typedef wchar_t WCHAR ;//A 16-bit character
用通用数据类型(如TCHAR, PTSTR)来表示文本字符和字符串。
用TEXT或_T宏来表示字面量字符和字符串,但为了保持一致性和更好的可读性,请避免两者使用。
2.微软将句柄设计成“与进程相关的”(process-relative).这也是为了程序的健壮性和安全性。但有3种机制可以允许进程共享内核对象: 使用对象句柄继承;为对象命名;复制对象句柄。
使用对象句柄继承: 只有在进程之间有父子关系的时候才可以继承句柄,(其中继承的是句柄,而不是对象)。
为创建一个可继承的句柄,父进程必须分配初始化一个SECURITY_ATTRIBUTES结构,并传给Creat函数。
eg: SECURITY_ATTRIBUTES sa;
sa.nLength=sizeof(sa);
sa.lpSecurityDescriptor=NULL;
sa.bInheritHandle=TRUE;//Make the returned handle inheritable
HANDLE hMutex=CreateMutex(&sa, FALSE, NULL);
假如父进程在创建子进程后,又创建了新的内核对象,并同样将它们句柄设可继承,那么正在运行的子进程是不会继承这些句柄的。
为对象命名: 许多但不是全部内核对象都可以进行命名。 HANDLE Create*(PSECURITY_ATTRIBUTES psa, BOOL bInitialOwner,...., PCTSTR pszName);中pszName不传入NULL时,而传入字符串就是为该对象命名了。
eg: 进程A: HANDLE hMutex=CreateMutex(NULL, false, TEXT("JeffMutex"));
进程B(B不一定为A的子进程,他是某进程):HANDLE hMutexProcessB=CreateMutex(NULL, false, TEXT("JeffMutex")); //这个时候系统首先会查看食饭存在名为JeffMutex的对象,如果存在并对象类型符合mutex,和调用者食饭拥有对该对象的完全访问权限,如果是的话系统就会在进程B的句柄表中查找一空白记录项,并将其初始化为指向现有内涵对象。并且注意如果进程B使用CreateMutex时并已存在一个指定名称的对象时,还传递安全属性和第二个参数,这些参数会被忽略。
事实上可在调用Create*后马上调用GetLastError判断自己刚刚是真的创建一个新内核对象,还是仅仅打开了一个现有的
1 HANDLE hMutex=CreateMutex(&sa, FALSE, TEXT("JeffMutex")); 2 if(GetLastError() == ERROR_ALREADY_EXISTS){ 3 //Opened a handle to an existing object. 4 //sa.lpSecurityDescriptor and the second parameter(false) are 5 //ignored 6 }else { 7 //Created a brand new object 8 //sa.lpSecurityDescriptor and the second parameter 9 // (false) are used to construct the object 10 }
当然也可用Open*,例如HANDLE OpenMutex(DWORD dwDesiredAccess, BOOL bInheritHandle, PCTSTR pszName);//如果对象不存在会返回FALSE。
posted on 2014-11-28 20:07 Zachary_wiz 阅读(204) 评论(0) 编辑 收藏 举报