boost::interprocess между службой Windows и пользовательским приложением

Я использую boost::interprocess для связи между двумя приложениями. Когда два приложения запускаются одним и тем же пользователем, все работает отлично.

Когда одно из приложений является службой, оно дает сбой.

Я обнаружил, что общий носитель на самом деле является файлом, созданным в каталоге «TMP». Так что это не удается, потому что каждое приложение создает свой собственный файл в своем собственном каталоге «TMP».

Может быть, я не использую его хорошим способом для моей конкретной цели.

Кто-нибудь знает, как решить мою проблему?

Большое спасибо,

Ник


EDIT: я пытался использовать "managed_mapped_file". Моя проблема в том, что реализация win32 вызывает "CreateFileMapping" без указания имени объекта. В моем особом случае, я думаю, мне нужно указать что-то вроде "Global\MyMappedFile", чтобы и приложение, и служба могли просматривать сопоставленный файл.


person Nicolas    schedule 28.01.2009    source источник
comment
Здравствуйте, я столкнулся с очень похожей проблемой, и я был бы очень признателен за более подробное описание этой темы, поскольку я совершенно новичок в boost::interprocess и не смог найти в Интернете примеров использования manage_windows_shared_memory. Спасибо. Изменить: я работаю под Windows Vista.   -  person    schedule 21.02.2011


Ответы (2)


Вот что работает:

  • Я использую "boost::interprocess::managed_windows_shared_memory"
  • Имя моего раздела "Global\MySharedMemory"
  • Мне нужно обработать случай, когда приложение запущено, а служба нет. Это связано с тем, что даже если мое приложение может иметь доступ для чтения/записи к общей памяти, оно не может ее создать. Только сервис может. (На самом деле, приложение может, только если у запускающего его пользователя есть специальная привилегия SeCreateGlobalPrivilege)

Может быть, кто-то найдет лучший способ ;-)

Ник

person Nicolas    schedule 29.01.2009

это что-то о Window Stations и ACL. вам нужно изменить источник, чтобы он работал между службой Windows и пользовательским приложением. в висте и вин7 сервисы работают на винста0, а приложения на винста1. поэтому вам нужно указать LPSECURITY_ATTRIBUTES с правильным DACL.

person Liveck    schedule 05.11.2009