我有一个用 C++ (Visual Studio 6.0) 编写的数据采集程序。一些客户希望通过他们自己的定制软件或 LabView 来控制软件。我想提出一个带有 dll 的简单 API,我可以将其分发给他们,并且想要一些关于如何开始的提示。这将是非常基本的,可能是 4 或 5 个命令。我的 DAQ 程序仍将在同一台机器上的自己的窗口中运行,我只想将其设置为由另一个程序控制。
6 回答
您使用 DLL 走在正确的轨道上。听起来,真正的诀窍在于决定您要使用哪种类型的进程间通信 (IPC)。选项有:套接字、管道、共享内存、同步对象(事件等)、文件、注册表等。
一旦你决定了,然后在你的可执行文件中实现一个监听器来等待来自任何使用你的 DLL 的软件的传入 IPC 消息。
就 API 而言,您可以像您想要的那样保持简单。让 DLL 公开您的 4 或 5 个函数(确保您只使用本机数据类型,如 char* 和 long,以避免模块边界问题),然后这些将使用您的 IPC 机制与您正在执行的应用程序进行通信。
像这样开始简单的事情会随着时间的推移而成长,所以你最好先做更多的工作,并使用一种会随着你成长的技术。
为您的程序实现 COM 接口将使客户在如何与它的接口方面有很大的自由,并且您不必担心 IPC 的机制等,因为 COM 旨在对您隐藏所有这些。
将来,COM 已经为诸如脚本语言很好支持的事件之类的事情定义了良好的习惯用法,等等,如果您需要它们。
更新:有很多实现 COM 的方法。您可以在一本好的 COM 书籍的指导下从第一个原则开始构建它,或者使用 ATL 之类的框架来节省一些样板。有很多很好的示例,例如参见MSDN。
COM 的最大优点是您不需要 DLL!您说,您的应用程序将始终运行。这意味着它可以充当 COM 对象创建者(“本地服务器”)。
如果有人想要一个“ stdcall
” DLL,你可以给他们一个 DLL,它在内部只是将所有调用转发到 COM 接口。写它会很简单。你说,你只有 5 个功能。这表明您有一个带有这 5 种方法的 COM 接口。当包装 DLL 加载时,它会要求您的 EXE 创建它的 COM 对象。DLL 依次公开 5 个 stdcall 方法,每个方法调用 COM 对象上的一个方法。
你可以使用一个dll。我会考虑的。但我也会考虑创建一个简单的基于 http 的 API,最好是 RESTful。
优点:易于移植。可以用任何语言轻松编写客户端应用程序。可以跨网络工作。测试变得更容易(使用脚本语言或浏览器)。
缺点:性能会变慢。在 C++ 中设置它需要更多的管道。我不确定 LabView 是否可以进行 http 调用。
就像是:
http://xxx/data [GET,也许是 POST 用于测试]
http://xxx/data/start [POST]
http://xxx/data/stop [POST]
http://xxx/data/parameters [POST]
鉴于您的要求,它可能有点矫枉过正,但也许不是。我工作过的许多应用程序都必须移植,如果我们可以使用更快的开发语言来测试和扩展它,那么扩展速度会更快。
LabVIEW 支持进行 DLL 调用,但这是 LabVIEW 开发中的弱点之一。如果操作不当,可能会导致应用程序更容易崩溃。作为一名 LabVIEW 开发人员,我喜欢 MattyT 关于创建 HTTP 服务的建议。每个平台上可以创建 TCP/IP 端口的每种语言都可以访问它。我认为您可以使用自己的自定义 TCP/IP 协议而不是完整的 HTTP,但无论哪种方式都解决了兼容性问题。
如果您确实使用 DLL,这里有一些提示。不要在函数调用参数列表中使用结构或指向结构的指针。不要在 DLL 中分配内存以传回 LabVIEW。LabVIEW 内置了内存管理,无法与其他人很好地配合使用。这可能适用于具有内存管理的其他语言,例如 Java。如果 LabVIEW 分配内存并将指针传递给 DLL,它会更好地工作。尽可能避免使用指针、数组和字符串。LabVIEW 可以将这些传递给 DLL,但它是一个高级主题,并且当 LabVIEW 开发人员也了解 C 语言时效果最好,但情况并非总是如此。
这里有一个相关的问题。我不想最终得到特定于 LabView 的东西,而且如果LabView 使用 stdcall ,它们似乎可以访问 dll。像这样的 dll 也可以从 VB 或其他 Windows 软件中调用,这也是我所追求的。
我不确定它是否能够访问 COM 接口,但希望能更详细地了解我的应用程序的外观。