【问题标题】:How do I launch a winforms form from a DLL correctly?如何正确地从 DLL 启动 winforms 表单?
【发布时间】:2010-05-26 16:33:03
【问题描述】:

还有一个与我类似的问题,但我想收集一些细节:

我想创建一个从非托管代码调用的 DLL。当在 DLL 中调用非托管函数时,我想收集信息并以某种形式显示出来。

我想做的是,当调用 DllMain() 时,原因是 DLL_PROCESS_ATTACH,我想实例化一个表单。此表单应在单独的线程上运行。当我的 DLL 中的函数 FOO() 被调用时,我想从 FOO() 中获取信息,将其发送到表单进行渲染。

所以,更具体地说:

i) 什么是创建 DLL 项目并能够让在设计器中创建的 Windows 窗体可用于 DLL 的正确方法?

ii) 为这个表单提供自己的线程和消息处理循环的正确方法是什么?

iii) 如何将信息从非托管 DLL 函数分派到表单,或者可以更新其自身状态和表单的托管类?

DLL 内部的表单有点像一个“监视器”,用于传入和传出 DLL 的数据,因此我可以跟踪错误/错误,但不会更改可用 DLL 函数的核心功能。

【问题讨论】:

  • 哦,我是用 C++/CLI 做的。

标签: winforms dll winapi c++-cli unmanaged


【解决方案1】:

在 DllMain 中执行操作时应非常小心(不能调用 LoadLibrary 或其他获取加载程序锁的函数)

【讨论】:

    【解决方案2】:

    一个应用程序只能有一个消息处理循环 - 您的所有 UI 都必须存在于一个线程上。您可以在应用程序的 UI 线程上创建一个无模式表单,但如果 UI 线程“忙”,它不会向您的表单发送消息,因此它不会是交互式的。

    恕我直言,避免麻烦的最简单方法是编写一个单独的 .exe 来处理表单并让您的 dll 简单地启动它,以便整个表单作为单独的常规 WinForms 进程运行。然后,您可以使用套接字、WM_USER 消息,甚至只是共享文件,将命令和数据从您的 dll 发送到表单的进程。 (socket 的好处是你也可以在不同的 PC 上运行监控表单)

    【讨论】:

      【解决方案3】:

      这是我的工作:

      静态 HWND *callbackWindow; 结构信息实例信息; DLLEXPORT void setCallbackWindow(HWND* newCallbackWindow) { 回调窗口 = 新回调窗口; } DLLEXPORT 无效 checkForInformation() { /* 收集一些信息 ... */ instanceInfo.computerOver = VERY_YES; } DLLEXPORT 无效检索信息(){ PostMessage(callbackWindow, ...); }

      首先,将回调设置为 Form.Handle。然后,您可以通过覆盖 .NET 表单中的 WndProc 来调用 checkForInformation(),或者您可以设置一个计时器来定期调用 checkForInformation。一旦您的表单准备好进行信息调用retrieveInformation() 并在表单的窗口处理程序中检查魔术消息(WM_USER + 您的偏移量)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-05
        • 2012-09-04
        • 2019-07-19
        • 2021-05-26
        相关资源
        最近更新 更多