Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
3-1221022999
Alexey
2008-09-10 09:03
2009.05.17
SQL-запрос в delphi


2-1238751873
plastic
2009-04-03 13:44
2009.05.17
ADO + TDBGrid + результат хранимой процедуры


2-1238916126
feDOS
2009-04-05 11:22
2009.05.17
Как огранизовать цикл по выдененным записям (MultiSelect) DBGrid?


15-1236701442
It's not me
2009-03-10 19:10
2009.05.17
AnsiString и его изменение потокобезопасно?


3-1220966118
Demo_nik
2008-09-09 17:15
2009.05.17
Определение координат ячейки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский