Как запустить код Visual Basic в работающем процессе Visual Basic 6.0 (например, MSVBVM60.DLL)? - PullRequest
0 голосов
/ 21 февраля 2011

Я работаю над отладкой устаревшего приложения Visual Basic 6.0;приложение было встроено в нативный код, но, к сожалению, у нас есть только двоичные файлы, но нет исходного кода.Поэтому я довольно ограничен в том, что касается изменений в программе.

Моя конечная цель - получить значение свойства «Имя» некоторых элементов управления с учетом их HWND.Я могу легко написать код VisualBasic для этого, но, к сожалению, я не вижу, как выполнить этот код в контексте работающего приложения.

Моя первая попытка состояла в создании ActiveX DLL в VisualBasic, которая выставляет мойФункция 'controlNameForHWND'.Во время выполнения, я тогда имел небольшую утилиту, вставляющую вторую вспомогательную DLL в запущенный процесс VB, и эта вспомогательная DLL затем вызывала CoCreateInstance , чтобы мой элемент управления ActiveX (который содержит функцию 'controlNameForHWND', которую я написал в VB)) создается внутри процесса приложения.

Это сработало хорошо, но, к сожалению, элемент управления ActiveX, очевидно, не выполняется в том же контексте, что и приложение, подлежащее отладке.Например, глобальное значение App.hInstance отличается, массив, возвращаемый глобальным Forms массивом, всегда пуст, и так далее.Так что весь мой код скрипта VisualBasic работает в параллельной вселенной.Невезение.: - /

У кого-нибудь еще есть идеи, как можно «внедрить» код VisualBasic в процесс VB6?Просмотр процесса с использованием Process Explorer показывает, что библиотека MSVBVM60.DLL загружена (виртуальная машина Microsoft Visual Basic), но не, например, VBA.DLL.Последнее было бы интересно, поскольку оно экспортирует недокументированную функцию EbExecuteLine для выполнения операторов скрипта.

У меня немного мало идей, поэтому я благодарен и за самые безумные идеи.: -)

1 Ответ

2 голосов
/ 21 февраля 2011

DLL-библиотека VB6 ActiveX будет работать в клиентском процессе, но не будет иметь доступа к коллекции Forms клиентского процесса.Я думаю, что App.hInstance должно возвращать то же значение.

Если вы отлаживаете свою DLL в отладчике VB6 IDE, то будет заставлять ее работать в отдельном процессе.Этот отладчик делает некоторые сумасшедшие вещи.Возможно, вам лучше будет создать файл PDB из ActiveX DLL и отладить его в отладчике Visual C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...