Winforms DLL无法在DCOM下启动

时间:2016-07-15 06:25:49

标签: c++ winforms dcom opc

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

任何想法? 感谢

2 个答案:

答案 0 :(得分:1)

检查服务器DCOM设置:

DCOM settings

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

答案 1 :(得分:0)

这是正常行为。修改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服务器,对我来说有点奇怪,MFC可能会更好/但很痛苦/为此)。

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