我正在从一个中等完整性过程创建一个boost::interprocess::message_queue,如下所示:
permissions p;
p.set_unrestricted();
message_queue queue(create_only, queueName, 1, sizeof(message_args), p);
并从低完整性进程打开队列:
message_queue queue(open_only, queueName);
这在Access denied.
中失败--这是因为用于存储message_queue的目录位于%ProgramData%
(%ProgramData%\boost_interprocess\
)中,而低完整性进程没有写权限。
是否有任何方法更改boost存储区进程间消息队列所在的目录?在中等或高完整性的过程和低完整性的过程之间,还有什么其他方法可以让这个过程发挥作用吗?
我在Windows7上使用boost 1.55,它是在Visual 2013中用VC++版本v120构建的。
发布于 2015-06-30 11:41:00
我没有亲自尝试过,但根据boost文档,这似乎是可能的。
在Windows平台中,如果注册表中存在“公共AppData”键,则在该目录中创建"boost_interprocess“文件夹(在XP中通常是"C:\Documents和Settings\All User\Application Data”和Vista中的"C:\ProgramData")。对于没有该注册表项和Unix系统的Windows平台,共享内存是在系统临时文件目录("/tmp“或类似文件)中创建的。
有关更多详细信息,请参阅链接。
我在Windows注册表中搜索了“公共AppData”键,并在下面找到了它:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
Common AppData
键指向%ProgramData%
,因此您可以尝试将其更改为其他东西,或者完全删除键,并查看默认位置是否对每个人都具有写权限。
编辑:我找到了更好的选择。使用BOOST_INTERPROCESS_SHARED_DIR_PATH
在interprocess #includes
之前定义新路径。(加进boost 1.56)
https://stackoverflow.com/questions/31135073
复制相似问题