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 将无效)
我有自己的基于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 将无效)