Как лучше всего конвертировать стандартный exe-файл vb6 в exe-файл activex?

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

Итак, из большого количества поисковых запросов я нашел метод, который преобразует текущее приложение в многопоточное, настроив его как activex exe и добавив класс, установленный в global-multi-use, чтобы это произошло. Теперь, выполняя редактирование и тестирование в режиме отладки, я обнаружил, что когда я выхожу, иногда происходит много странных сбоев.

'main.frm - button click call
'On the button click, create a new object
Set obj = CreateObject("MyApp.clsThread")
Call obj.NewThread

'clsThread
' Create a new form and load it to run on a new thread
Public Sub NewThread()
    Dim frm As Object
    Set frm = New frmDogbert
    Load frmDogbert
    frm.show
    Set frm = Nothing
End Sub

Итак, что мне абсолютно необходимо знать, когда я это делаю, т. Е. потенциальные проблемы и т. д., так как я опасаюсь, что приложение становится более нестабильным. Или есть способ лучше?

Обновления:

Вместо того, чтобы насильственно взламывать свое приложение в псевдопоточном приложении, я воспользовался советом хороших людей и реорганизовал компонент в стандартный exe, вернул свое приложение к стандартному exe и вызвал их через оболочку. Красиво работает :)

Спасибо


person melaos    schedule 25.02.2009    source источник


Ответы (2)


Visual Basic 6 сам по себе не является многопоточным. Разница в многозадачном поведении между ActiveX EXE и ActiveX DLL очевидна только при ссылке из другого VB6 EXE. Объекты, созданные из глобального универсального класса, определенного в ActiveX EXE, запускаются в собственном контексте. Объект, созданный из ActiveX DLL, запускается в контексте вызывающего EXE.

Теперь многопоточность можно взломать в VB6, но она очень болезненна и имеет много недостатков (например, вы не можете использовать кнопку остановки в среде IDE, чтобы остановить сеанс отладки, иначе программа выйдет из строя).

ActiveX EXE хорош тем, что порождает отдельный, но связанный экземпляр, который может работать отдельно, не останавливая основную программу. Основываясь на вашем кратком описании, я бы сказал, что лучше всего оставить EXE как есть, но больше форм / модулей / классов в отдельный EXE и иметь исходный EXE-ссылку на ActiveX EXE.

Обратите внимание, что вам не нужно компилировать до .EXE, вы можете изменить расширение на .DLL, и это все равно ActiveX EXE. Это делается для того, чтобы пользователь по ошибке не запустил ActiveX EXE сам по себе.

person RS Conley    schedule 25.02.2009
comment
@RS спасибо за предложение, так как я делаю DLL, лучше / стабильнее сделать его DLL из .net? благодаря. - person melaos; 26.02.2009
comment
Нет! Он не имеет в виду, что вы должны делать DLL. Он означает, что вы должны сделать EXE обычным способом, а затем изменить расширение файла на DLL. Это помешает пользователям запускать EXE. - person MarkJ; 26.02.2009
comment
Хотя, если вы предоставите меню «Пуск» и ярлыки для EXE-файла на рабочем столе, мы надеемся, что пользователи не будут выкапывать из каталога вашего приложения запускающие EXE-файлы наугад. У нас есть несколько EXE-файлов ActiveX в каталогах наших приложений, но ни один пользователь еще не запускал их. Если бы они это сделали, я бы сказал, что они заслуживают ошибок! - person MarkJ; 26.02.2009
comment
Мы сделали это с одним из наших устаревших приложений, то есть переместили файлы в отдельные EXE-файлы - это работает хорошо. Чтобы пользователи не запускали автономный EXE-файл, мы передаем известную опцию командной строки из основного приложения, а затем выполняем, если оно распознано. - person Miles D; 26.02.2009
comment
@Melaos MarkJ прав в том, что я говорил просто о переименовании расширения из EXE в DLL. Однако, если вы будете осторожны, вы сможете создать и ссылаться на .NET, который обрабатывает многозадачность. Я считаю, что это было бы излишним для независимой формы. - person RS Conley; 26.02.2009
comment
@RS, @MarkJ, спасибо, ребята, вы помогли мне еще раз сменить парадигму. Хотел бы я выбрать оба из них в качестве ответа, но я выберу этот, так как комментарии также содержат большой кусок мяса. Благодарность!! - person melaos; 27.02.2009
comment
Если у вас есть Sub Main в вашем ActiveX EXE, вы можете проверить, запускает ли пользователь приложение или ваша программа запускает его, проверив App.StartMode в первой строке Main. Например: Если App.StartMode = vbSModeStandalone, то выйдите из Sub (другая константа - vbSModeAutomation). - person Mike Spross; 27.02.2009

Можете немного прояснить вопрос? Я не понимаю, зачем он должен быть многопоточным? Почему вы не можете просто отображать формы в немодальном режиме, тогда все они будут видны и отзывчивы одновременно. Если у вас нет фоновой обработки, постоянно работающей в вашей основной форме, что маловероятно из вашего вопроса, поскольку это заблокирует основную форму, а также другие.


Мелаос говорит: «Главный редактор frm - это здесь главное, и мне нужно разрешить пользователю запускать дополнительные формы, чтобы делать что-то еще, например, загружать файлы на наш сервер и конвертировать видеофайлы в другие форматы». И эти формы используют оболочку для вызова других бывших. И время работы занимает довольно много времени.


В этом случае я рекомендую превратить другие формы в отдельные EXE-файлы, а не использовать многопоточность, что сложно. Вы говорите, что между основной формой и подчиненными мало коммуникации - она ​​просто их показывает. Поэтому вам даже не нужно создавать исполняемые файлы ActiveX для подчиненных форм. Просто сделайте их стандартными EXE-файлами и обработайте их оболочкой из основной формы.

person MarkJ    schedule 25.02.2009
comment
@MarkJ Ну, главный редактор frm - это здесь главное, и мне нужно разрешить пользователю запускать дополнительные формы для выполнения некоторых других вещей, таких как загрузка файлов на наш сервер и преобразование видеофайлов в другие форматы. И эти формы используют оболочку для вызова других бывших. И время работы занимает довольно много времени. - person melaos; 26.02.2009
comment
@MarkJ, спасибо, пока я могу запускать основную форму редактора и эти другие дочерние формы одновременно, проблем не будет. благодаря. - person melaos; 27.02.2009