Winforms DLL 在 DCOM 下不启动

Winforms DLL does not start under DCOM

我有自己的基于ATL(exe模块)的OPC服务器。基于 WinForms(DLL 模块)的用户界面。在单独线程的 _tWinMain 中,我从 DLL 调用 Application::Run()。如果我手动启动我的服务器或者如果服务器由本地 OPC 客户端启动,这就可以正常工作。但是,OPC 客户端位于其他机器上,如果我尝试启动服务器,服务器会成功启动,但未显示 UI Window。

有什么想法吗?? 谢谢

检查您的服务器 DCOM 设置:

很可能服务器被配置为 运行 作为启动用户,因此它在单独的 Window 站点上执行,并且 GUI 对登录用户不可见。如果您更改配置以使用交互式用户,则应该解决一个问题。虽然如果当前没有用户登录,您的服务器将无法启动。

这是正常行为。一种修改 exe 以查找 运行 实例并尝试显示 UI.

的解决方案

示例(放在::InitInstance中)

HWND hWnd = ::FindWindowEx(NULL, NULL, NULL, [Your title]);
if (hWnd)
{
    ::ShowWindow(hWnd, SW_SHOWNORMAL);
    ::SetForegroundWindow(hWnd);
    return FALSE;
}

现在,当您的服务器由远程客户端启动时,您可以简单地尝试在服务器计算机上启动服务器 exe,它会显示 UI。

也许上面的一些调整对你不起作用(带有 WinForm 的 ATL opc 服务器 ui 对我来说有点奇怪,MFC 可能更好/但痛苦/对此)。

唯一的缺点是必须使用当前登录的用户安全主体启动 OPC 服务器。否则 UI 将不会显示(ShowWindow 将无效)