我正在从中等完整性过程中创建一个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.
的Windows中失败这是因为用于存储message_queue的目录位于%ProgramData%
(%ProgramData%\boost_interprocess\
)中,低完整性进程没有写入权限。< / p>
有没有办法更改boost存储进程间消息队列的目录?有没有其他方法可以在中等或高度完整性流程和低完整性流程之间进行此工作?
我在Windows 7上使用boost 1.55,在Visual Studio 2013中使用VC ++版本v120构建。
答案 0 :(得分:1)
我自己没有尝试过,但根据提升文档,这似乎是可能的。
在Windows平台中,如果“Common AppData”键存在于 注册表,在该目录中创建“boost_interprocess”文件夹(in XP通常是“C:\ Documents and Settings \ All Users \ Application Data”和 在Vista“C:\ ProgramData”中。对于没有它的Windows平台 注册表项和Unix系统,共享内存是在系统中创建的 临时文件目录(“/ tmp”或类似的)。
有关详细信息,请参阅link。
我在Windows注册表中搜索了“Common 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
定义新路径。 (在增强1.56中添加)