Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.05.17;
Скачать: CL | DM;

Вниз

Вызов виртуальных методов посредством ассемблера   Найти похожие ветки 

 
andreil   (2009-04-05 15:40) [0]

Имеется описание класса:
CSteamInterface003 = class (TObject)
     procedure _Destructor(); virtual; stdcall;
     function ChangePassword(const cszCurrentPassphrase, cszNewPassphrase: pChar; pbChanged: pInteger; pError: pSteamError): SteamCallHandle_t; virtual; cdecl;
     ......
 end;

метоод вызова - safecall, поэтому приходится делать через ассемблер перенаправление на другой аналогичный класс, расположенный в ДЛЛке.
Делаю так:
function CSteamInterface003.MountAppFilesystem(pError: pSteamError): Integer;
asm  
 mov  edx, [EMU_SteamInterface006]
 call dword ptr [edx + VMTOFFSET CSteamInterface006.MountAppFilesystem]
end;

При вызове идет вылет.

Как правильно-то делать?


 
Игорь Шевченко ©   (2009-04-05 18:16) [1]

mov edx,[...]
mov edx,[edx]
call [edx + vmtoffset]

?


 
andreil   (2009-04-05 18:32) [2]

нет, все равно вылазит ошибка :(


 
Игорь Шевченко ©   (2009-04-05 19:40) [3]

Какой кошмар


 
Сергей М. ©   (2009-04-05 19:46) [4]


> метоод вызова - safecall


Что-то не видно в описании твоего класса никаких safecall


> приходится делать через ассемблер


Не понятно, зачем при этом понадобился ассемблер ..
Делфи чудесно справляется с этой задачей и без применения BASM


 
Игорь Шевченко ©   (2009-04-05 19:47) [5]

У тебя классы-то на чем написаны ?

А еще лучше не париться с ассемблером, а сделать переходник на delphi


 
oxffff ©   (2009-04-05 20:26) [6]


> andreil   (05.04.09 15:40)


Stdcall вызов подразумевает передачу всех параметров
Right-to-left через стек. Ошибка в этом.


 
andreil   (2009-04-05 21:08) [7]

У меня есть только "переходник" к cdecl"овским функциям:
function CSteamInterface003.AbortCall(handle: SteamCallHandle_t; pError: pSteamError): Integer;
asm
 push [ebp+12]
 push [ebp+ 8]
 call AbortCall
 add esp, 8
 pop ebp
 ret 8
end;

Может, в оригинальном классе используется другой метод вызова, так вот там объявляется без явного указания типа вызова. хз, какой там используется, но высшеприведенный код работает 100%, а мне необходимо не вызывать внешнюю функцию, а вызвать метод класса.



Страницы: 1 вся ветка

Текущий архив: 2009.05.17;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.011 c
15-1236796634
Petr V. Abramov
2009-03-11 21:37
2009.05.17
нифигасебе...


15-1236968185
Другг
2009-03-13 21:16
2009.05.17
Архивация и сжатие


15-1237111075
Немо2
2009-03-15 12:57
2009.05.17
Что бы придумать, что бы не ездить на работу?


15-1237382359
немо2
2009-03-18 16:19
2009.05.17
select min(col1) from tabl1. Работает по 5 минут. MSSQL2000


15-1237292509
Unknown user
2009-03-17 15:21
2009.05.17
Просмотр связей между модулями в проектах Delphi