Я разрабатываю приложение-агент, которое обращается к общей памяти нескольких приложений. Установка включает в себя три приложения:
A: приложение WPF C#.
B: приложение Python — агент.
C (BLauncher): A C # Служба Windows, которая обновляет и перезапускает B, если она не запущена.
A: C#
Код: Выделить всё
public void UpdateInfo(String fieldName, T info) where T : struct
{
try
{
DataTag dataTag = new DataTag();
_accessor.Read(0, out dataTag);
FieldInfo fieldInfo = typeof(DataTag).GetField(fieldName, BindingFlags.Public | BindingFlags.Instance);
if (fieldInfo == null)
{
throw new ArgumentException($"Field '{fieldName}' does not exist in DataTag.");
}
if (fieldInfo.FieldType == typeof(T))
{
fieldInfo.SetValueDirect(__makeref(dataTag), info);
}
else
{
throw new ArgumentException($"Field '{fieldName}' is of type {fieldInfo.FieldType}, not {typeof(T)}.");
}
_accessor.Write(0, ref dataTag);
}
catch (Exception e)
{
Console.WriteLine($"Error: {e.Message}");
}
}
Код: Выделить всё
def connect(self):
if self.shm is None:
try:
self.shm = shared_memory.SharedMemory(name=self.memory_segment_name, create=False)
logger.info(f"Successfully connected to shared memory segment: {self.memory_segment_name}")
except FileNotFoundError:
logger.error(f"Error: Shared memory segment '{self.memory_segment_name}' not found.")
self.shm = None
except Exception as e:
logger.error(f"An unexpected error occurred: {e}")
self.shm = None
- ПК1: Мой ноутбук под управлением Windows 11 с одной учетной записью пользователя. Доступ к общей памяти здесь работает правильно.
- ПК2: компьютер под управлением Windows 10 с двумя учетными записями пользователей: Hello и eHello. На этом компьютере возникают проблемы с общей памятью.
На ПК1 (одна учетная запись пользователя) приложение A пишет ~2000 байт данных в сегмент общей памяти с именем «MACHINE_INFO». Приложение Б успешно считывает данные при запуске как скрипт Python или как отдельный .exe-файл.
Однако на ПК2 (с двумя учетными записями пользователей) происходит следующее:
- Приложение C (служба Windows, работающая под учетной записью System) запускает B как .exe-файл.
- B сообщает, что сегмент общей памяти «MACHINE_INFO» не существует.
- Я подозреваю, что это может быть связано с тем, как общая память работает между сеансами в Windows. Предыдущее обсуждение показало, что общая память зависит от сеанса, но я не уверен, что это полностью объясняет проблему.
- C запускается как служба Windows под системной учетной записью.
- Может ли приложение WPF (A) записывать в сегмент общей памяти, к которому имеет доступ системная учетная запись (и, следовательно, C)?
- Да Windows обрабатывает общую память в зависимости от сеанса, что может привести к тому, что сегмент «MACHINE_INFO» будет недоступен во всех сеансах?
- Как настроить или реализовать общую память, чтобы она была доступна для всех сеансов, особенно для приложений, работающих под системной учетной записью?
Подробнее здесь: https://stackoverflow.com/questions/792 ... -different
Мобильная версия