Единая DLL для нескольких устройств, использующих один и тот же драйвер - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь разработать стороннюю DLL между пользовательским приложением и драйвером, которая сможет управлять обменом данными с несколькими устройствами (одной модели), подключенными через P CIe к одному и тому же P C . Одна DLL будет помещена в известную папку, например, % SystemRoot% / System32 . Загрузка / выгрузка DLL должна вызывать некоторые функции, например. FindDevices (), OpenDevice (), CloseDevice (), которые обновят структуру, определенную в DLL, например. DeviceManager:

const int MAX_DEV_INSTANCES;

typedef struct DEV_STATUS_T {

    BOOL swConnected;           // State of SW connection
    UINT32 swConnIdx;           // ID of SW app

    BOOL hwConnected;           // State of HW connection
    UINT32 hwPortIdx;           // ID of port for HW

} DEV_STATUS;

typedef struct DEV_MANAGER_T {

    UINT32 devicesNr;
    DEV_STATUS status[MAX_DEV_INSTANCES];
    DEVICE device[MAX_DEV_INSTANCES];

} MANAGER;

MANAGER manager;

Предположим, у нас есть 2 устройства: A, B и 2 приложения: M, N. Оба они пытаются подключиться к одному отдельному устройству: M контролирует A, N контролирует B.

Мои вопросы:

  1. Предположим, M загружает DLL и обновляет DLL MANAGER struct {status [0], device [0]}. Если N загружает ту же DLL, сможет ли он увидеть, что M внес изменения в {status [0], device [0]} или M, N будут иметь отдельные копии структур MANAGER, с которыми нужно работать?

  2. Если M и N не осведомлены о внешних изменениях, сделанных в MANAGER (MANAGER не является «глобальным»), как достичь этого? ? Должен ли он управляться на нижнем уровне - код драйвера?

  3. Если M и N осведомлены о внешних изменениях, сделанных в MANAGER (MANAGER - 'global '), будет ли OpenDevice () / CloseDevice () единственными функциями, которым необходимо изменить структуру MANAGER?

Спасибо за любые комментарии и предложения по этому поводу .

1 Ответ

1 голос
/ 17 июня 2020

Вот несколько указателей:

  1. Нет, оба приложения будут в разных областях памяти, поэтому изменения, внесенные в MANAGER приложением M, не повлияют на приложение N
  2. Несколько решений, но будьте осторожны с параллелизмом в любом из них:
    1. Использовать буфер общей памяти для данных
    2. Поместите диспетчер в отдельный процесс (это может быть драйвер, если у вас есть к нему доступ)
    3. Используйте блокировки файлов, чтобы показать, что устройство «принадлежит» процессу
  3. Не знаю ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...