Доброго времени суток! Данный пример содержит модуль инжекта ActiveX DLL в нужный поток процесса, а также показывает как подсоединится к работающему EXE и получить доступ к его VB.Global объекту. Это позволяет к примеру вызывать методы открытых форм/контролов/App и т.д. Модуль инжекта позволяет создавать объекты в других потоках и получать отмаршаленую ссылку - методы можно вызывать прямо из IDE. В примере запускается EXE и вызываются методы его формы: Код (Text): If CreateProcess(StrPtr(App.Path & "\..\dummy\dummy.exe"), 0, ByVal 0&, ByVal 0&, 0, 0, ByVal 0&, 0, tSI, tPI) = 0 Then MsgBox "CreateProcess failed" Exit Sub End If . . . Set cVBGetGlobal = CreateVBObjectInThread(tPI.dwThreadId, App.Path & "\..\dll\GetVBGlobal.dll", "CExtractor") Set cForms = cVBGetGlobal.Forms Set frmMain = cForms(0) ' // Change back color of picturebox frmMain.Controls("picTest").BackColor = vbRed ' // Draw line on picturebox frmMain.Controls("picTest").Line (0, 0)-Step(100, 50), vbGreen, BF frmMain.Caption = "Test" Сам код доступа к объекту VB.Global находится в ActiveX DLL, которая внедряется в процесс с помощью модуля инжекта. Вообще доработав логику можно еще дополнительно поизвлекать переменные и в модулях. Инжект работает следующим образом: В память процесса для каждого нового потока записывается шеллкод. Каждый шеллкод имеет 2 типа данных: данные процесса (общие для всех потоков), данные потока; Шеллкод запускается стандартно через CreateRemoteThread; Если шеллкод запущен впервые в процессе то регистрируется новый класс окна для общения с основным кодом; Ставиться хук WH_GETMESSAGE в нужном потоке и посылается сообщение-триггер; Поток замораживается в ожидании обработки хука; В процедуре хука, сразу снимается хук, инициализируется COM (CoInitialize) и создается окно для коммуникации; Данное окно "живет" в нужном потоке и основное приложение может отправлять ему сообщения; Для создания объекта отправляется сообщение WM_CREATEOBJECT; Обработчик получая это сообщение, создает объект из DLL и делает маршалинг для передачи ссылки в другой процесс (CoMarshalInterface); Основной процесс воссоздает данные маршалинга и вызывает CoUnmarshalInterface, получая ссылку на объект. Ссылка.
А какие юзкейсы у этого? Типа из одного VB6 приложения манипулировать контекстом другого VB6 приложения?
Да, причем любого, без исходников. Ну и это как пример, внедрять можно абсолютно любую AX-либу, дергать объекты и вызывать их методы. Если объекты поддерживают IDispatch то можно хоть из скриптов их юзать.