关于进程间共享句柄的问题

shallchen 2005-06-08 12:59:21
在一个DLL:PORTDLL中封装了对设备操作;
将有两个或者几个EXE对此设备进行操作,也就是PORTDLL操作;
本人想实现在设备句柄第一次打开之后,后面的几个EXE进程中能够直接使用;

事项在几个进程中共享一个设备句柄操作;比如HANDLE hDevice = CreateFile(...),在其它进程中就可以共享它,而且都可以对此句柄进行操作;不需要在CREATE了.

希望能够直接更改PORTDLL就可以做到.当然也可以别的方法;
...全文
127 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
In355Hz 2005-06-08
  • 打赏
  • 举报
回复
忘了说 DuplicateHandle 复制的句柄同样需要用 CloseHandle() 关闭。
In355Hz 2005-06-08
  • 打赏
  • 举报
回复
除了利用 DLL 共享段外,还必须用 DuplicateHandle 将 hDevice 复制到其他的进程中,否则在一个进程中打开的句柄是不能用于其他进程的(可以继承的句柄能在子进程里使用)。

#pragma comment(linker, "/SECTION:shared,rws")

#pragma data_seg("shared")
HANDLE hSharedDevice = NULL;
HANDLE hSharedProcess = NULL;
#pragma data_seg()

HANDLE GetDevice()
{
if (hSharedDevice == NULL)
{
hSharedDevice = CreateFile(...); // Initialze device

// Get "real" handle of current process.
hSharedProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, GetCurrentProcessId());

return hSharedDevice;
}

HANDLE hDevice = NULL;

DuplicateHandle(hSharedProcess, hSharedDevice, GetCurrentProcess(), &hDevice,
0, FALSE, DUPLICATE_SAME_ACCESS);

return hDevice;
}
柯本 2005-06-08
  • 打赏
  • 举报
回复
用共享段实现
#pragma data_seg("shareddata")
HANDLE hDevice=NULL;
#pragma data_seg()
关于共享段,有几点重要的说明:
a. 必须在链接选项里指定该段为共享,project->settings->link->object/library,加上/section:shareddata,rws
b. 第二种指定共享段的方法:在def文件的sections里加上一句shareddata read write shared
c. 第三种指定共享段的方法:在程序里加上一句#pragma comment(linker,"section:shareddata,rws")
d. 所有的变量必须初始化,否则链接程序会把它放到普通数据段
e. 如果不初始化变量,需要在段外用“__declspec(allocate("shareddata")) 变量类型 变量名”的方式定义

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧