2016-07-15 3 views
0

У меня есть собственный OPC-сервер, основанный на ATL (модуль exe). Пользовательский интерфейс на основе WinForms (DLL-модуль). В _tWinMain в отдельном потоке я вызываю Application::Run() из DLL. Это отлично работает, если я запускаю свой сервер вручную или сервер запускается локальным клиентом OPC. Тем не менее, клиент OPC находится на другом компьютере, и если я пытаюсь запустить сервер, сервер запускается успешно, но окно UI не отображается.Winforms DLL не запускается в DCOM

Любые идеи? Благодаря

+0

UPD: Пользовательский интерактивный режим не применялся, потому что отсутствовал ключ HKCR \ CLSID \ {ID} \ AppID = {ID}. Теперь это прекрасно работает, спасибо. – M90

ответ

1

Проверьте настройки сервера DCOM:

DCOM settings

Скорее всего сервер настроен для работы в качестве пользователя запуск, поэтому выполняются на отдельной станции Window и GUI не виден вошедшим на пользователя. Если вы изменяете конфигурацию для использования интерактивного пользователя, проблема должна быть решена. Хотя, если ни один пользователь не вошел в систему, ваш сервер не сможет начать работу.

+0

Спасибо за ваш ответ. Скорее всего, это правильное направление для решения моей проблемы. Но эти изменения не имеют никакого эффекта. – M90

0

Это нормальное поведение. Одно из решений для изменения вашего exe для поиска исполняемого экземпляра и попытки отображения пользовательского интерфейса.

Пример (положить это в :: InitInstance)

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

Теперь, когда ваш сервер запущен с помощью удаленного клиента, вы можете просто попробовать запустить ех сервера на сервере, и отображает пользовательский интерфейс.

Возможно, вышеуказанное не будет работать для вас с некоторой настройкой (ATL-сервер opc с WinForm ui немного странно для меня, MFC может быть лучше/но боль/для этого).

Единственный недостаток, с которым должен запускаться OPC-сервер с главным администратором безопасности в настоящее время. В противном случае пользовательский интерфейс не будет отображаться (ShowWindow не будет иметь эффекта)