找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3949|回复: 0

《Windows核心编程》学习笔记(5)– 详述"复制对象句柄"

[复制链接]
发表于 2012-3-17 22:36:06 | 显示全部楼层 |阅读模式
1。跨进程边界共享内核对象的最后一招是使用DuplicateHandle函数:BOOL DuplicateHandle(
    HANDLE hSourceProcessHandle,
    HANDLE hSourceHandle,
    HANDLE hTargetProcessHandle,
    LPHANDLE lpTargetHandle,
    DWORD dwDesiredAccess,
    BOOL bInheritHandle,
    DWORD dwOptions );
简单的说,这个函数获得一个进程的句柄表中的一个记录项,然后在另一个进程的句柄表中创建这个记录项的一个副本.具体应用如下:
#include <stdio.h>
#include <windows.h>

int main(void)
{
//进程A创建一个名为"MYOBJ"的互斥量
HANDLE hObjInProcessA = CreateMutex(NULL, FALSE, "MYOBJ");
//判断,如果已经创建了这个互斥量就打印 "run error\n"
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
  printf("run error\n");
  system("pause");
  return 0;
}

//获得进程B的进程句柄(7036为进程B的PID,随便弄了个做了下试验)
HANDLE hProcessB = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 7036);

// hObjInProcessB是相对于进程B的句柄,他标示的对象就由"进程A中代码引用的hObjInProcessA"所标示的对象.
HANDLE hObjInProcessB;
DuplicateHandle(GetCurrentProcess(),
     hObjInProcessA,
     hProcessB,
     &hObjInProcessB,
     0,
     FALSE,
     DUPLICATE_SAME_ACCESS);
//收尾工作.
//ps:hObjInProcessB千万不能关掉

CloseHandle(hProcessB);
CloseHandle(hObjInProcessA);
printf("run \n");
system("pause");
return 0;


}
以上程序第一次运行的时候把互斥量句柄hObjInProcessA复制到进程B的句柄表中,用变量名


hObjInProcessB来保存.



此时A退出,B不退出,



再运行A,就会打印 run error 的提示,表明互斥量复制成功,已存在于B进程中.



.
2。还可以通过另一种方式来使用DuplicateHandle:假设一个进程有对一个文件映射对象的读写权限.在程序中的某个位置,我们要调用一个函数,并希望它对文件映像对象进行只读访问.为了是应用程序变得更健壮,可以使用
DuplicateHandle 为现有的对象创建一个新句柄,并确保这个这个新句柄只有只读权限.然后,把这个只读权限的句柄传递给函数.

示例代码:

HANDLE hFileMapRW = CreateFileMapping(INVALID_HANDLE_VALUE,
           NULL,
           PAGE_READWRITE,
           0,
           10240,
           NULL);
HANDLE hFileMapRO;
DuplicateHandle(GetCurrentProcess(), hFileMapRW,
     GetCurrentProcess(), &hFileMapRO,
     FILE_MAP_READ, FALSE, 0);
//调用自己的函数
ReadFromTheFileMapping(hFileMapRO);
CloseHandle(hFileMapRO);
CloseHandle(hFileMapRW);









您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-23 17:31 , Processed in 0.012229 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表