1 (изменено: chessman, 2011-06-23 15:36:09)

Тема: JScript/VBScript & Win32: расширение возможностей DynamicWrapperX

Данный скрипт расширяет возможности объекта DynamicWrapperX, а именно:

1. Добавляет новый встроенный метод RegisterAddr. Первый параметр - адрес памяти, остальные параметры, как у метода Register.

RegisterAddr( Addr, FuncName [, i=ParamTypes] [, r=RetValType] )

Этот метод "именует" участок кода в виртуальном пространстве процесса. Это позволяет, например, сделать ассемблерную вставку из скрипта и напрямую обратиться к ней. Кроме этого, это позволяет обратится к "кривым" экспортным функциям ("?GetBkEndUI@@YAPAVCBkEndUI@@XZ") и к функциям экспортируемым по ординалу.

Пример:

handle = Wrap.LoadLibrary(""BkEnd"")
Addr   = Wrap.GetProcAddress(handle, ""?GetBkEndUI@@YAPAVCBkEndUI@@XZ"")     'class CBkEndUI * __cdecl GetBkEndUI(void)    
Wrap.RegisterAddr Addr, ""GetBkEndUI"", ""f=s"", ""r=l""

Этим же методом можно легко организовать вызов _thiscall, сделав ассемблерную вставку:

handle = Wrap.LoadLibrary(""blang"")
func = Wrap.GetProcAddress(handle, ""?FindProc@CBLModule@@QBEHPBDH@Z"")        'CBLModule::FindProc
Wrap.RegisterAddr buf, ""FindProc"", ""i=sl"", ""r=l""
.
.
.
Function this_call(ECX, Addr)                                '    
    Wrap.NumPut &hB9,                     buf, 0, ""b""    '    mov ecx, ....   pObj
    Wrap.NumPut ECX,                     buf, 1
    Wrap.NumPut    &hE9,                     buf, 5, ""b""    '    jmp ...Addr
    Wrap.NumPut    Addr - (buf + 6 + 4),     buf, 6                '
End Function

2. Снимает ограничение на количество вызовов RegisterCallBack. Это реализовано, путем организации связанного списка функций, аналогично, как это делает метод Register.

Технические исправления:
* в IClassFactory::CreateInstance изменен размер объекта на указатель на последний вызов RegisterCallBack;
* IDispatch::Release освобождается не только память под объект, но и память выделенная методами Register и обновленным RegisterCallBack; так же вызывается Release для объекта vbscript.

P.S. Всё сказанное относится к конкретной версии dll, т.к. в скрипте используются "абсолютные" offset'ы, привязанные к файлу «dynwrapx.dll».
P.P.S. В связи с тем, что мой опыт программирования на ассемблере не велик, возможно что-то я сделал не оптимально, поэтому буду рад услышать критику.

2 (изменено: chessman, 2011-01-16 23:50:43)

Re: JScript/VBScript & Win32: расширение возможностей DynamicWrapperX

Добавлено еще 2 встроенных метода:
1. GetIDispatch(<Объект>) возвращает указатель на объект - адрес памяти.

Outlook = СоздатьОбъект("Outlook.Application");
pObj = Wrap.GetIDispatch(Outlook);

2.GetObject(<адрес>) по указателю на объект возвращает объект. Метод вызывает AddRef объекта.

Obj = Wrap.GetObject(pObj)

Примеры приведены для 1С, но смысл я думаю понятен.

3 (изменено: chessman, 2011-05-23 16:02:45)

Re: JScript/VBScript & Win32: расширение возможностей DynamicWrapperX

Объединил скрипт с родной DLL.
Собирал руками - поэтому возможны глюки.

Post's attachments

dynwrapx.zip 6.53 kb, 335 downloads since 2011-05-20 

You don't have the permssions to download the attachments of this post.