Интерфейсы определен так: Код (Text): ;IUnknown virtual at ebx NameInterface#.IUnknown.QueryInterface dd 0 NameInterface#.IUnknown.AddRef dd 0 NameInterface#.IUnknown.Release dd 0 end virtual ;IDispatch virtual at ebx NameInterface#.Disp.QueryInterface dd 0 NameInterface#.Disp.AddRef dd 0 NameInterface#.Disp.Release dd 0 NameInterface#.GetTypeInfoCount dd 0 NameInterface#.GetTypeInfo dd 0 NameInterface#.GetIDsOfNames dd 0 NameInterface#.Invoke dd 0 end virtual Далее создаю объект (Винворд) и получаю IUnknown Код (Text): invoke CLSIDFromProgID,NameInterface#.RegKey,NameInterface#.GUID invoke CoCreateInstance,NameInterface#.GUID,0,5,IID_IUnknown,\ NameInterface#.pvTable mov eax,[NameInterface#.pvTable] mov eax,[eax] mov [NameInterface#.vTable],eax затем получаю интерфейс IDispatch mov ebx,[NameInterface#.vTable] stdcall [NameInterface#.IUnknown.AddRef],[NameInterface#.pvTable] stdcall [NameInterface#.IUnknown.QueryInterface],[NameInterface#.pvTable],\ IID_IDispatch,NameInterface#.Disp.pvTable mov eax,[NameInterface#.Disp.pvTable] mov eax,[eax] mov [NameInterface#.Disp.vTable],eax Далее пытаюсь определить индекс метода AppSh du 'Exec',0 mov ebx,[NameInterface#.Disp.vTable] stdcall [NameInterface#.GetIDsOfNames],[NameInterface#.Disp.pvTable],\ 0,AppSh,1,0,IDs Но в ответ получаю непонятный код ошибки 800706F4. Что бы это могло значить?
Код (Text): // MessageId: RPC_X_NULL_REF_POINTER // // MessageText: // // A null reference pointer was passed to the stub. // #define RPC_X_NULL_REF_POINTER 1780L
Заместо 5 в CoCreateInstance, тебе, скорее всего, нужно использовать CLSCTX_INPROC_SERVER. AddRef тебе не нужно использовать здесь, т.к. она нужна во внутреннем устройстве метода. Довольно плохо читается. Советую использовать coinvoke.
pas Убедись, что IDs не равен NULL, а также попробуй вместо первого параметра передавать не 0, а указатель на структуру IID_NULL
Вот как, примерно, это должно выглядить: invoke CLSIDFromProgID,OF tx_reg_key,OF tx_name_GUID invoke CoCreateInstance,OF tx_name_GUID,NULL,CLSCTX_INPROC_SERVER, IID_IUnknown,OF x_1 .if_succeeded com x_1,IUnknown.QueryInterface,IID_IDispatch,ADDR x_2 mv lp_1,tx('Exec') com x_2,IID_IDispatch.GetIDsOfNames,NULL,OF lp_1,1,0,OF IDs .endif ----------------------- HRESULT IDispatch::GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid) REFIID riid OLECHAR FAR* FAR* rgszNames unsigned int cNames LCID lcid DISPID FAR* rgdispid
Странная вещь. Теперь если передавать ссылки на имена методов которые есть в интерфейсе сообщается об ошибке STATUS_ACCESS_VIOLATION equ 0C0000005h, а если передавать, что то от балды то DISP_E_UNKNOWNNAME equ 80020006h. Посмотрел STATUS_ACCESS_VIOLATION появляется в результате неудачи функций HeapReAlloc и HeapAlloc. Подскажите почему так происходит?
IID_NULL - это не нуль это указатель на структуру заполненую нулями. Имя должно быть юникодным. И указывай локализацию 400н если Typelib английский.
Вот этот код - у меня работает. Попробуй на своем компе, только нужно зарегистрировать (mswinsck.ocx). Если не будет работать тогда я пас ;################################################# .586 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\ole32.inc includelib \masm32\lib\ole32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib include oaidl.inc .data? szBuffer db 400 dup (?) .data IID_NULL GUID <0, 0, 0, <0, 0, 0, 0, 0, 0, 0, 0>> CLSID_Module GUID <0248DD896h, 0BB45h, 011CFh, <09Ah, 0BCh, 000h, 080h, 0C7h, 0E7h, 0B7h, 08Dh>> IID_IDispatch GUID <000020400H, 00000H, 00000H, <0C0H, 000H, 000H, 000H, 000H, 000H, 000H, 046H>> sztempl db "Disp ID for 'Bind' = %08X",0 szCaption db "Hello ",0 NameID dd 0 pMain dd 0 rgszNames dd offset dwBind dwBind dw 'B','i','n','d', 0, 0, 0 .code start: invoke OleInitialize, 0 invoke CoCreateInstance, addr CLSID_Module, 0, CLSCTX_INPROC_SERVER, addr IID_IDispatch, addr pMain coinvoke pMain, IDispatch, GetIDsOfNames, addr IID_NULL, addr rgszNames, 1, 400h, addr NameID coinvoke pMain, IDispatch, Release invoke wsprintfA, addr szBuffer, addr sztempl, NameID invoke MessageBox, 0, addr szBuffer, addr szCaption, 0 invoke ExitProcess, 0 end start 78224065__ocxx.exe