FreeBasic
Вы хотите отреагировать на этот пост ? Создайте аккаунт всего в несколько кликов или войдите на форум.

COM - я туплю!

Участников: 2

Перейти вниз

COM - я туплю! Empty COM - я туплю!

Сообщение  VerhoLom Сб Дек 17, 2011 12:52 pm

Не получается создать объект из ДЛЛ, написанной на ВБ6 Cool . Спотыкаемся на вызове IUnknown->vtbl->QueryInterface для получения IDispatch Razz . Вот код:

Код:
#Include "windows.bi"
#Include Once "win/ole2.bi"

Type PP_CLASS1
   'IDispatch
   As UInteger ui1
   As UInteger ui2
   As UInteger ui3
   As UInteger ui4
   As UInteger ui5
   As UInteger ui6
   As UInteger ui7
   
   'Class1
   Msg As Function(ByVal As Any Ptr)As UInteger
End Type

Function CreateObject naked (ByVal o As WString Ptr)As Any Ptr
   Asm
      push ebp
      mov ebp,esp
      Sub esp,16+8                                 'CLSID+ppIUnknown+ppIDispatch
      pushad
      
      'Int 3
      
      'ProgID?
      lea eax,dword Ptr [ebp-16]                     'CLSID pp.class1
      push eax
      push dword Ptr [ebp+8]                        '"pp.class1"
      Call CLSIDFromProgID
      test eax,eax                                 'OK?
      jz @1                                          'jmp if yes
      
      'CLSID?
      lea eax,dword Ptr [ebp-16]
      push eax
      push dword Ptr [ebp+8]
      Call IIDFromString
      test eax,eax
      jnz @e
      
      
   @1:
      '*******************************************************************
      'Get IUnknown
      lea eax,dword Ptr [ebp-20]                     'ppIUnknown
      push eax
      Call @2                              'push CLSID_IUnknown pointer into stack
      .byte 0,0,0,0,0,0,0,0,0xC0,0,0,0,0,0,0,0x46            'CLSID IUnknown
   @2:
      push 1                              'Inproc Server
      push 0
      lea eax,dword Ptr [ebp-16]                     'clsid pp.class1
      push eax
      Call CoCreateInstance
      test eax,eax                           'eax=S_OK? OK!!!
      jnz @e                              'jmp if not
      
      mov eax,[ebp-20]
      test eax,eax                           'pIunknown=0?
      jz @e                                 'jmp if yes
      
      '*******************************************************************
      'Get IDispatch
      lea eax,dword Ptr [ebp-24]                     'ppIDispatch
      push eax
      Call @3
      .byte 0,2,4,0,0,0,0,0,0xC0,0,0,0,0,0,0,0x46            'CLSID IDispatch
   @3:
      lea eax,dword Ptr [ebp-20]                     'ppIUnknown
      push eax
      mov eax,[eax]                           'eax=ppIUnknown->vTable
      
      '=========== ZLO!
      Call [eax+0]                           '!!!! CRASH !!! ppIUnknown->vTable->QueryInterface
      '==========

      test eax,eax                           'eax=S_OK?
      jnz @e                              'jmp if not
      
      mov eax,[ebp-24]
      test eax,eax                           'pIDispatch=0?
      jz @e                                 'jmp if yes
      
      '*******************************************************************
      'Release IUnknown
      mov eax,[ebp-20]
      push eax
      Call [eax+8]
      
      '*******************************************************************
      'eax=ppIDispatch
      lea eax,dword Ptr [ebp - 24]
      jmp @ret
      
   @e:
      '*******************************************************************
      'return 0 if error
      Xor eax,eax
      
   @ret:
      push eax
      popad
      pop eax
      Add esp,16+8
      mov esp,ebp
      pop ebp
      ret
   End Asm
End Function

Sub main Cdecl Alias "main"()
   OleInitialize(0)
   
   Dim As PP_CLASS1 Ptr o
   Dim As PP_CLASS1 Ptr Ptr obj=CreateObject(@WStr("pp.class1"))

   'Dim As CLSID iDisp,iUnk
   
   o=*obj
   o->Msg(obj)
   ExitProcess(0)
End Sub

вызов приводит в msvbvm60.dll на строку (смотрел в ОЛЛИ): Arrow

Код:
7296E685  6E              OUTS DX,BYTE PTR ES:[EDI]                ; I/O command

понятно, что это не будет работать. Sad

CoCreateInstance отрабатывает нормально (возвращает S_OK(=0)). Может я с указателями туплю? pig

И еще: код написан для линковки в МАСМ32. Но это так, к слову. Вот батник линковки:

Код:
@echo off

\Dev\FreeBASIC\fbc -r -lib com.bas
\Dev\FreeBASIC\bin\win32\as com.asm -o com.o

\Dev\masm32\bin\link /entry:main /machine:ix86 /subsystem:windows com.o \Dev\masm32\lib\ole32.lib \Dev\masm32\lib\kernel32.lib
if errorlevel 1 pause

VerhoLom
VerhoLom

Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 42

Вернуться к началу Перейти вниз

COM - я туплю! Empty Re: COM - я туплю!

Сообщение  electrik Пт Янв 06, 2012 1:16 pm

в больших проектах у меня были глюки из-за того, что я линковал масмовским линкером.
пытался даже парсер с одного асма в другой делать.
там видимо есть какие-то глюки с объектными файлами. я отказался от такого метода линковки.
знаю, что у microsoft объектные файлы ms-coff, а у fb, как-там они, вылетело из памяти, а- omf.
как заявляет microsoft, вродь они и то и то поддерживают.
фиг знает, к сожалению именно во внутренности объектных файлов я пока не залезал.


electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Вернуться к началу Перейти вниз

COM - я туплю! Empty Re: COM - я туплю!

Сообщение  VerhoLom Вс Янв 08, 2012 1:50 pm

Тут видимо не в объектных файлах дело: дело в обращении к памяти по неправильному адресу. Тут руками ассемблерный код написан, и в отладчике (Олли, Ида) все выглядит так же... Тут я наверное глючу lol!
VerhoLom
VerhoLom

Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 42

Вернуться к началу Перейти вниз

Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения