繁体   English   中英

单个 DLL 用于使用相同驱动程序的多个设备

[英]Single DLL for multiple devices using the same driver

我尝试在用户应用程序和驱动程序之间设计一个第三方 DLL,它将能够管理通过 PCIe 连接到同一台 PC 的多个设备(相同型号)的通信。 单个 DLL 将放置在已知文件夹中,例如%SystemRoot%/System32 加载/卸载 DLL 应该调用一些函数,例如。 FindDevices()、OpenDevice()、CloseDevice() 将更新 DLL 中定义的结构,例如。 装置经理:

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 结构 {status[0], device[0]}。 如果 N 加载相同的 DLL,它是否能够看到 M 在 {status[0], device[0]} 或 M 中进行了更改,N 将有单独的 MANAGER 结构副本来处理?

  2. 如果 M 和 N不知道MANAGER 中所做的外部更改(MANAGER 不是“全局”),那么实现这一点的方法是什么? 它应该在较低层 - 驱动程序代码中管理吗?

  3. 如果 M 和 N知道MANAGER 中所做的外部更改(MANAGER 是“全局”),那么 OpenDevice() / CloseDevice() 是否是唯一需要修改 MANAGER 结构的函数?

感谢您对此事提出任何意见和建议。

这里有一些提示:

  1. 不,两个应用程序将位于不同的 memory 空间中,因此应用程序MMANAGER的修改不会对应用程序N产生任何影响
  2. 几种解决方案,但要注意其中任何一种的并发性:
    1. 为数据使用共享 memory 缓冲区
    2. 将管理器放在一个单独的进程中(如果您可以访问它,这可能是驱动程序)
    3. 使用文件锁来表示设备为进程“拥有”
  3. 不知道...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM