|
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);
|
|