Форум: "Начинающим";
Текущий архив: 2009.05.17;
Скачать: [xml.tar.bz2];
ВнизВызов виртуальных методов посредством ассемблера Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.004 c