zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    Linux:Day7(上) find、文件特殊权限、if语句
    Linux:Day6(下) vim编辑器
    Linux:Day6(上) egrep、条件测试
    Linux:Day5 shell编程初步、grep
    Linux:Day4(下) 用户及组管理
    Linux中的cat、more、less、head、tail命令
    ajax中的contendType和dataType知识点梳理
    Django使用jsonp和cors解决跨域请求问题
    Django的Modelforms的介绍
    Django的Rbac介绍3
  • 原文地址:https://www.cnblogs.com/wizzhangquan/p/4129295.html
Copyright © 2011-2022 走看看