Главная страница
    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
15-1237371996
DmitryFox
2009-03-18 13:26
2009.05.17
Delphi 2009 и Delphi Prism


15-1237010852
@!!ex
2009-03-14 09:07
2009.05.17
Подскажите удобный SVN хостинг.


15-1236764505
desc
2009-03-11 12:41
2009.05.17
Функция возвращения пути


15-1237152645
Юрий
2009-03-16 00:30
2009.05.17
С днем рождения ! 16 марта 2009 понедельник


15-1236968185
Другг
2009-03-13 21:16
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский