2015-07-03 3 views
1

У меня есть сервер автоматизации , размещенный VB6 exe.Заставить COM-сервер оставаться открытым

COM API используется из Excel VBA:

Dim o as MyCOMAPI.MyCOMType 
Set o = new MyCOMAPI.MyCOMType 
o.DoSomething 

Когда я создаю объекты в VBA Исполняемый файл запускается вместе с автоматизацией COM и VBA можно использовать API.

Но exe быстро закрывается и «случайно» Excel, я думаю, когда Excel решит, что он больше не нужен COM API.

Это поведение вызывает случайные ошибки.

Простым решением является запуск exe перед запуском кода VBA; в этом случае все работает нормально, так как exe не останавливается, пока пользователь не закрыт.

Есть ли у вас какая-либо информация/документация о том, как Excel VBA управляет вызовами размещенных API?

Есть ли способ избежать такого поведения и сохранить exe до тех пор, пока код VBA не решит его остановить?

ответ

4

Это было бы поведением по умолчанию для сервера автоматизации COM, когда последний объект разыменован, что означает, что переменная, указывающая на сервер, не имеет значения.

Теперь, если ваш код выглядит примерно так: сегодня

Sub MyFunction() 
... 
Dim o as MyCOMAPI.MyCOMType 
Set o = new MyCOMAPI.MyCOMType 
o.DoSomething 
End Sub 

Затем жизнь сервер подключен к жизни о переменной. Эта переменная не получает ничего, когда функция будет завершена, а затем сервер будет закрыт (если нет других переменных, поддерживающих его).

Чтобы убедиться, что ваш COM-сервер поддерживается в течение длительного времени, просто определите переменную как переменную Public, как в примере ниже.

Этот образец начнется и покажет Excel и сохранит его, пока не вызывается функция ShutdownExcel.

Public o As Excel.Application 

Sub MakeSureExcelIsRunning() 
    If o Is Nothing Then 
     Set o = New Excel.Application 
     o.Visible = True 
    End If 
End Sub 

Sub ShutdownExcel() 
    Set o = Nothing 
End Sub 
+0

Спасибо за ваш ответ. Я пробовал аналогичный шаблон, обнажая открытый объект в выделенном модуле, но я думаю, что даже в этом случае объект может быть удален Excel. Поэтому, возможно, мне стоит оставить ссылку на него во всех моих модулях, но я не уверен, что этого будет достаточно. В любом случае вы получите мой +1, и если нет другого ответа, я соглашусь с ним. – Pragmateek

+0

Excel будет * не * закрывать EXE, если есть выдающаяся переменная, относящаяся к объекту из вашего EXE. И обратите внимание, что просто выполнение глобального 'Dim v As New Libname.myClass' будет * не * работать - это не делает то, что думает большинство людей (http://stackoverflow.com/q/2478097/2230). Вы должны «Установить» его вручную из функции или Sub. –

1

Из документов COM.

**Component Automation** 

Выключение Объекты

объекты ActiveX должен завершить работу следующим образом:

Если приложение объекта видна, объект должен закрыть только в ответ на явное пользовательская команда (например, нажав «Выход» в меню «Файл») или эквивалентную команду от клиента ActiveX.

Если приложение объекта не видно, объект должен быть выключен только при исчезновении последней внешней ссылки.

Если приложение объекта видимо и контролируется клиентом ActiveX, оно должно стать невидимым, когда пользователь отключит его (например, нажав «Выход» в меню «Файл»). Такое поведение позволяет контроллеру продолжать управлять объектом. Контроллер должен отключиться только тогда, когда последняя внешняя ссылка на объект исчезла.

© Microsoft Corporation. Все права защищены.

Когда вы пишете COM-сервер exe, первое, что вы делаете, оно берет ссылку на себя при запуске как обычное exe, иначе exe отключается, как только инициализация завершается.

+0

Спасибо за указатель на официальную документацию Microsoft. – Pragmateek

Смежные вопросы