2015-11-23 2 views
0

У меня есть два простых приложения, которые используют общую память от boost_1_55_0.
BoostCreate.exe создать общую память.
BoostOpen.exe открыть созданную общую память.
Я построил их с VS2008, и они работают на Windows7/8.1, но в Windows XP BoostOpen.exe не открывается общая память.
Это BoostCreate.exe код:boost :: interprocess :: managed_shared_memory() open_only не работает на XP

using namespace boost::interprocess; 
std::string shMemName("MySharedMem"); 
managed_shared_memory shMem = managed_shared_memory(create_only, shMemName.c_str(), 1000); 

Это BoostOpen.exe код:

using namespace boost::interprocess; 
std::string shMemName("MySharedMem"); 
try 
{ 
    managed_shared_memory shMem = managed_shared_memory(open_only, shMemName.c_str()); 
} 
catch(boost::interprocess::interprocess_exception& e) 
{ 
    printf("Error opening %s\n", e.what()); 
} 

Исключение составляет: The system cannot find the file specified.

Попытка boost_1_59_0 я получаю некоторые ошибки компоновщика:

error LNK2001: unresolved external symbol "public: void __thiscall boost::container::container_detail::has_member_function_named_construct<class boost::container::new_allocator<char> >::BaseMixin::construct(void)" ([email protected]@[email protected][email protected]@[email protected]@@@[email protected]@[email protected]@QAEXXZ) 
+0

ошибка линкера можно обойти путем создания отладки сборки, или отключить оптимизацию, она появляется. Попробуйте, чтобы узнать, что такое поведение в Boost 1_59: – sehe

+0

Вы используете клиент в том же [сеансе] (http://blogs.technet.com/b/askperf/archive/2007/07/24/sessions-desktops- and-windows-station.aspx)? Разрешения и пространство имен могут привести к тому, что карта будет невидимой/недоступной. – sehe

+0

Да, используя собственные Win32 'CreateFileMapping' и' OpenFileMapping', я могу создать и открыть одну и ту же разделяемую память. К сожалению, здесь я использую 'managed_shared_memory ;; конструкцию ', и для этого потребуется переписать много кода для использования собственного API. –

ответ

0

BoostOpen.exe был неудачу в вызове CreateFileA апи, возвращая -1 в качестве значения ручки.
я заметил, что на Windows7 прирост имя разделяемой памяти было:

C:\ProgramData/boost_interprocess/1447248616/MySharedMem 

в то время как в XP был:

C:\Documents and Settings\All Users\Application Data/boost_interprocess//MySharedMem 

Похоже, штамп времени отсутствовал в период между //.
Я обнаружил, что get_bootstamp() (tmp_dir_helpers.hpp) возвращает пустую строку bootstamp.stamp на XP.
Чтобы избежать добавления эту пустую метку времени, я заметил линию 19 в \ boost_1_55_0 \ повышающего \ межпроцессного \ подробно \ workaround.hpp

//#define BOOST_INTERPROCESS_HAS_KERNEL_BOOTTIME 

и теперь с именем:

C:\Documents and Settings\All Users\Application Data/boost_interprocess/MySharedMem 

он работает как на Windows7 и XP.
Другим решением является оставить линию 19 и раскомментируйте строку 21:

#define BOOST_INTERPROCESS_BOOTSTAMP_IS_LASTBOOTUPTIME 
Смежные вопросы