Какова наилучшая практика для преобразования стандартного exe-файла vb6 в exe-файл activex? - PullRequest
1 голос
/ 25 февраля 2009

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

Итак, из большого количества поисков я нашел метод, который преобразует текущее приложение в многопоточное, настроив его как exe-файл activex и добавив набор классов для 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-файл и вызвал их через оболочку. Работает красиво :)

Спасибо

Ответы [ 3 ]

2 голосов
/ 25 февраля 2009

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

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

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

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

1 голос
/ 25 февраля 2009

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


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


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

0 голосов
/ 25 февраля 2009

Не делай этого. Многопоточность невероятно сложна для правильного выполнения даже при использовании предназначенных для этого инструментов.

...