boost :: interprocess между службой Windows и пользовательским приложением - PullRequest
4 голосов
/ 28 января 2009

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

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

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

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

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

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

Nic


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

Ответы [ 2 ]

4 голосов
/ 29 января 2009

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

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

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

Nic

1 голос
/ 05 ноября 2009

это что-то про оконные станции и ACL. вам нужно изменить исходный код, чтобы он работал между службой Windows и пользовательским приложением. в Vista и Win7 сервисы работают на winsta0, а приложения на winsta1. поэтому вам нужно дать LPSECURITY_ATTRIBUTES с правильным DACL.

...