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编辑  收藏  举报

导航