COM - я туплю!
Участников: 2
FreeBasic :: Программирование :: Общее
Страница 1 из 1
COM - я туплю!
Не получается создать объект из ДЛЛ, написанной на ВБ6 . Спотыкаемся на вызове IUnknown->vtbl->QueryInterface для получения IDispatch . Вот код:
вызов приводит в msvbvm60.dll на строку (смотрел в ОЛЛИ):
понятно, что это не будет работать.
CoCreateInstance отрабатывает нормально (возвращает S_OK(=0)). Может я с указателями туплю?
И еще: код написан для линковки в МАСМ32. Но это так, к слову. Вот батник линковки:
- Код:
#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 на строку (смотрел в ОЛЛИ):
- Код:
7296E685 6E OUTS DX,BYTE PTR ES:[EDI] ; I/O command
понятно, что это не будет работать.
CoCreateInstance отрабатывает нормально (возвращает S_OK(=0)). Может я с указателями туплю?
И еще: код написан для линковки в МАСМ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- Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 42
Re: COM - я туплю!
в больших проектах у меня были глюки из-за того, что я линковал масмовским линкером.
пытался даже парсер с одного асма в другой делать.
там видимо есть какие-то глюки с объектными файлами. я отказался от такого метода линковки.
знаю, что у microsoft объектные файлы ms-coff, а у fb, как-там они, вылетело из памяти, а- omf.
как заявляет microsoft, вродь они и то и то поддерживают.
фиг знает, к сожалению именно во внутренности объектных файлов я пока не залезал.
пытался даже парсер с одного асма в другой делать.
там видимо есть какие-то глюки с объектными файлами. я отказался от такого метода линковки.
знаю, что у microsoft объектные файлы ms-coff, а у fb, как-там они, вылетело из памяти, а- omf.
как заявляет microsoft, вродь они и то и то поддерживают.
фиг знает, к сожалению именно во внутренности объектных файлов я пока не залезал.
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: COM - я туплю!
Тут видимо не в объектных файлах дело: дело в обращении к памяти по неправильному адресу. Тут руками ассемблерный код написан, и в отладчике (Олли, Ида) все выглядит так же... Тут я наверное глючу
VerhoLom- Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 42
FreeBasic :: Программирование :: Общее
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|