• 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。

  • 相关阅读:
    备忘录模式
    状态模式(state pattern)
    【2020-12-08】你努力所得洞见是独一无二的
    【2020-12-07】这种紧巴巴的日子不多了,好好享受吧
    【2020-12-06】人生十三信条
    【2020-12-05】人生十三信条
    【2020-12-04】责任,是走向智慧的方向
    【2020-12-03】偶尔打个篮球,还是有收获的
    【2020-12-02】实践,是在用意念去行动
    【2020-12-01】高收益的家庭投资理财推荐
  • 原文地址:https://www.cnblogs.com/wizzhangquan/p/4129295.html
Copyright © 2020-2023  润新知