Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.03.2014, 15:50   #1
WhiskasTM
Подтвердите свой е-майл
 
Регистрация: 11.04.2012
Сообщений: 85
По умолчанию Как заставить Delphi отправлять Self через регистр ecx?

Всех с наступающим магазином.

Вообщем есть библиотека на c++ и есть куча экспортов и классов и эти классы ожидают параметр this(Self) придет к ним в регистре ecx, а Делфи посылает им в eax.

Пришлось делать обертку:
Код:
type
  INI_Reader = record
  {$HINTS OFF}
  strict private
    data : array [0..5480] of Byte;
  {$HINTS ON}
  public
    function open(const Filename:LPCSTR;const Dunno:BOOL=False):Boolean;
    function close:Boolean;
  end;

function ini_open(const S:LPCSTR;const Dunno:BOOL=False):Boolean;cdecl;external Common name '?open@INI_Reader@@QAE_NPBD_N@Z';
function ini_close:Boolean;cdecl;external Common name '?close@INI_Reader@@QAEXXZ';

implementation

function INI_Reader.open(const Filename:LPCSTR;const Dunno:BOOL=False):Boolean;
asm
  push    Dunno
  push    Filename
  mov     ecx,Self
  call    ini_open
end;

function INI_Reader.close:Boolean;
asm
  mov     ecx,Self
  call    ini_close
end;
Вот cdecl: и он автоматом складывает аргументы в стек командой push(если не асме писать),а можно ли как-то заставить его также автоматом делать вот это mov ecx,Self? Если нет, то как можно избавиться от двойного call-а? Ну, как фактически инлайнить ассемблер? Просто не хочу обертки, опять.
WhiskasTM вне форума Ответить с цитированием
Старый 20.03.2014, 15:56   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Переписать C++ библиотеку? Фактически параметрами местами поменять..
Человек_Борща вне форума Ответить с цитированием
Старый 20.03.2014, 16:00   #3
WhiskasTM
Подтвердите свой е-майл
 
Регистрация: 11.04.2012
Сообщений: 85
По умолчанию

Библиотека от игры майкрософт freelancer, исходники 11 лет ждем. Никак. Я не знаю, может плагины к IDE есть какие-нибудь, копмпонентов же много.
WhiskasTM вне форума Ответить с цитированием
Старый 20.03.2014, 16:48   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

с чего вы тогда взяли что там cdecl? А не stdcall? или fastcall или иной калл...
Человек_Борща вне форума Ответить с цитированием
Старый 20.03.2014, 17:15   #5
WhiskasTM
Подтвердите свой е-майл
 
Регистрация: 11.04.2012
Сообщений: 85
По умолчанию

Посмотрел, это __thiscall. Переменная класса в ecx, всё остальное через стек. cdecl ближе всего показался. Ну и тут же сразу всплыло: http://www.programmersforum.ru/showp...09&postcount=4

Понятно вообщем, спасибо, closed.
WhiskasTM вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ADOconnection- соединение с БД через регистр Silverra Компоненты Delphi 4 13.02.2013 10:37
TListView как заставить корректно отображаться png, через TImageList или TcxImageList fedorov2012 Общие вопросы Delphi 1 09.02.2013 21:08
Как заставить считать excel через раз или более serginho007 Microsoft Office Excel 14 30.03.2011 06:06
Как заставить Delphi игнорировать регистр? Akronis Общие вопросы Delphi 2 20.11.2009 23:30
Получать\отправлять пакеты через соединение другого приложения Frozzeg Работа с сетью в Delphi 8 20.03.2009 17:11