如何从DLL正确启动winforms表单?

如何从DLL正确启动winforms表单?,winforms,dll,winapi,c++-cli,unmanaged,Winforms,Dll,Winapi,C++ Cli,Unmanaged,还有一个问题与我的问题类似,但我想收集一些细节: 我想创建一个从非托管代码调用的DLL。在DLL中调用非托管函数时,我希望收集信息并以某种形式显示它 我想做的是,当调用DllMain时,原因是DLL\u PROCESS\u ATTACH,我想实例化一个表单。此窗体应在单独的线程上运行。当调用DLL中的函数FOO时,我希望从FOO获取信息,将其发送到表单进行渲染 因此,更具体地说: i创建DLL项目并使在设计器中创建的Windows窗体可用于DLL的正确方法是什么 ii为该表单提供自己的线程和消息

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

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

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

因此,更具体地说:

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

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

iii如何将非托管DLL函数中的信息分派到窗体,或者分派到可以更新自身状态和窗体的托管类


DLL中的表单是数据进出DLL的监视器,因此我可以跟踪错误/bug,但不要更改可用DLL函数的核心功能。

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

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

我想避免麻烦的最简单方法是编写一个单独的.exe来处理表单,并让dll简单地启动它,这样整个表单就可以作为一个单独的常规WinForms进程运行。然后,您可以使用套接字、WM_用户消息,甚至只是共享文件从dll向窗体进程发送命令和数据。插座的优点是,您也可以在不同的PC上运行监视窗体

static HWND *callbackWindow; struct Info instanceInfo; DLLEXPORT void setCallbackWindow(HWND* newCallbackWindow) { callbackWindow = newCallbackWindow; } DLLEXPORT void checkForInformation() { /* gather some info ... */ instanceInfo.computerOver = VERY_YES; } DLLEXPORT void retrieveInformation() { PostMessage(callbackWindow, ...); }
首先,将回调设置为Form.Handle。然后,您可以通过重写.NET表单中的WndProc来调用checkForInformation,也可以设置计时器来定期调用checkForInformation。表单准备好进行信息调用检索信息后,请在表单的窗口处理程序中签入一条神奇的消息WM_USER+your offset。

哦,我正在C++/CLI中执行此操作。