У меня есть свой собственный OPC-сервер на основе ATL (exe-модуль). Пользовательский интерфейс на основе WinForms (модуль DLL). в _tWinMain
в отдельной ветке звоню Application::Run()
из DLL. Это прекрасно работает, если я запускаю свой сервер вручную или если сервер запускается локальным OPC-клиентом. Однако OPC-клиент находится на другом компьютере, и если я пытаюсь запустить сервер, сервер запускается успешно, но окно пользовательского интерфейса не отображается.
Есть идеи??
Спасибо
Проверьте настройки DCOM вашего сервера:
Скорее всего, сервер настроен для запуска в качестве запускающего пользователя, поэтому он выполняется на отдельной оконной станции, а графический интерфейс не отображается для вошедшего в систему пользователя. Если вы измените конфигурацию для использования интерактивного пользователя, проблема должна быть решена. Хотя, если ни один пользователь не вошел в систему, ваш сервер не сможет запуститься.
Это нормальное поведение. Одно из решений — модифицировать ваш exe-файл, чтобы найти работающий экземпляр и попытаться отобразить интерфейс.
Пример (поместите это в :: InitInstance)
HWND hWnd = ::FindWindowEx(NULL, NULL, NULL, [Your title]);
if (hWnd)
{
::ShowWindow(hWnd, SW_SHOWNORMAL);
::SetForegroundWindow(hWnd);
return FALSE;
}
Теперь, когда ваш сервер запущен удаленным клиентом, вы можете просто попытаться запустить exe-сервер на сервере, и он отображает пользовательский интерфейс.
Возможно, вышеописанное не сработает для вас с некоторыми изменениями (OPC-сервер ATL с WinForm ui немного странный для меня, MFC может быть лучше / но боль / для этого).
Единственный недостаток, что сервер OPC должен быть запущен с зарегистрированным в данный момент пользователем безопасности пользователя. В противном случае пользовательский интерфейс не будет отображаться (ShowWindow не будет иметь никакого эффекта)