【问题标题】:Winforms DLL does not start under DCOMWinforms DLL 在 DCOM 下不启动
【发布时间】:2016-07-15 06:25:49
【问题描述】:

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

有什么想法吗?? 谢谢

【问题讨论】:

  • UPD:未应用用户交互模式,因为缺少 HKCR\CLSID\{ID}\AppID = {ID} 键。现在这工作正常,谢谢。

标签: c++ winforms dcom opc


【解决方案1】:

检查您的服务器 DCOM 设置:

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

【讨论】:

  • 感谢您的回答。很可能这是解决我的问题的正确方向。但是这种变化没有任何效果。
【解决方案2】:

这是正常行为。一种修改 exe 以查找正在运行的实例并尝试显示 UI 的解决方案。

示例(将其放入 ::InitInstance)

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多