2013-06-18 5 views
0

Я написал приложение Windows Forms VB.NET, которое запрашивает строку из COM-объекта вне процесса каждый раз, когда активировать пожары событий. В моей форме есть две вкладки, поэтому мне нужно программно переключаться на правильную вкладку каждый раз, когда мое окно получает фокус. Работает хорошо, пока ...VB.NET exe, который говорит о внепроцессном COM для активации бонусов событий при внешнем скрипте AppActivates

случайно, кто-то побежал VBScript (да, сценарий, не EXE), который содержит:

Set shell = CreateObject("WScript.Shell") 
    shell.AppActivate("Window Title That Matches My App") 

Этот сценарий последовательно разбивает мое приложение. Обычно так плохо, что диалог Exception обычно не может рисовать сам. Я должен убить его из диспетчера задач. Иногда Исключение читается. (Я также подтвердил исключение, присоединившись к исполняемому exe с Visual Studio). Это: «System.Runtime.InteropServices.COMException (0x8001010D): исходящий вызов не может быть выполнен, так как приложение отправляет синхронный вход».

Что действительно бесполезно с моим разумом, так это то, что мое приложение имеет множественное обнаружение экземпляра с использованием мьютекса, и если существующий экземпляр работает, мой собственный код (скомпилированный) использует собственное ключевое слово AppActivate VB.NET, и это НЕ сбой моего приложение. Он активирует исполняемый экземпляр и выходит из избыточного экземпляра, как и ожидалось.

Проблема, по-видимому, срабатывает только при помощи приложения AppSctivate cscript/wscript. Я написал 3-футовый .vbs, чтобы подтвердить это. Это повторяемо.

Есть ли способ уловить или избежать этого в моем скомпилированном приложении?

+0

Неуправляемые серверы уязвимы, другое приложение может связаться с ним и сделать его неправильным, чтобы затронуть все * подключенные клиенты. Если у вас нет исходного кода для сервера, вы вряд ли сможете это сделать. Мы, конечно, не можем. –

+0

Да, сервер - это собственная третья сторона, которой я не контролирую. Я создаю какие-то огромные gotchas, обертывая это в try/catch? Это поможет? – amonroejj

+0

И я все равно хотел бы узнать, что отличает AppActivate VB.NET от AppActivate Vbscript. – amonroejj

ответ

0

Это мне не ясно, почему этот подход на самом деле исправляет эту проблему, но она работает:

  1. Добавить таймер в форму.
  2. Переместите весь _Активированный код на событие _Tick таймера.
  3. Сделать событие _Activated запустило таймер.
  4. Сделать событие _Tick остановить таймер, затем выполнить COM-материал.