Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

__thiscall и C++ Builder

57K
14 марта 2010 года
Miatar
3 / / 14.03.2010
Во общем интересует - есть ли какие либо варианты в C++ Builder. Нужно для того, что бы указатель на класс передавался через регистр ECX, тк указатели на классы в C++ builder передаются через стек, либо вообще все передается через регистр(fastcall).
Visual Studio поддерживает __thiscall:
 
Код:
typedef void (__thiscall *SomeFunc) (int Pointer);

Builder же директиву __thiscall не понимает вообще. Интересует есть ли обходные варианты тк пересаживаться на другую среду ради одной директивы как то не хочется. Можно ли как то самому указать что какой то параметр должен передаваться через регистр такой то.


П.С. Нужно для взаимодействия с чужим классом(не COM, и исходников нет).
1
14 марта 2010 года
kot_
7.3K / / 20.01.2000
Ну самый очевидный вариант - использование ассемблерной вставки. Кроме того, начиная с 2006 вроде как Borland подерживает данное соглашение (за точность не ручаюсь - у точните у тех кто использует в работе).
14
15 марта 2010 года
Phodopus
3.3K / / 19.06.2008
Цитата: Miatar
Нужно для взаимодействия с чужим классом(не COM, и исходников нет).


COM хотя бы бинарный стандарт, а вот уверены ли вы в том что VC++ и Builder помимо __thiscall будут бинарно совместимы? Я про использование VCшного класса "напрямую" в Builder.

57K
16 марта 2010 года
Miatar
3 / / 14.03.2010
Стоит С++ Builder 2010, и thiscall он не знает.

Что касается поддержки класса, то на 90% уверен.
1
16 марта 2010 года
kot_
7.3K / / 20.01.2000
Цитата: Miatar
Стоит С++ Builder 2010, и thiscall он не знает.

Что касается поддержки класса, то на 90% уверен.


Странно.
Ну тогда используйте асм.

5
17 марта 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: kot_
Странно.
Ну тогда используйте асм.


Действительно, соглашение __thiscall не поддерживается C++Builder-ом, и вообще это соглашение по-разному воспринимается компиляторами. Ссылка на Вики.

246
17 марта 2010 года
GIZMO
1.8K / / 30.07.2004
Цитата: Miatar
Во общем интересует - есть ли какие либо варианты в C++ Builder. Нужно для того, что бы указатель на класс передавался через регистр ECX, тк указатели на классы в C++ builder передаются через стек, либо вообще все передается через регистр(fastcall).
Visual Studio поддерживает __thiscall:
 
Код:
typedef void (__thiscall *SomeFunc) (int Pointer);

Builder же директиву __thiscall не понимает вообще. Интересует есть ли обходные варианты тк пересаживаться на другую среду ради одной директивы как то не хочется. Можно ли как то самому указать что какой то параметр должен передаваться через регистр такой то.


П.С. Нужно для взаимодействия с чужим классом(не COM, и исходников нет).


см. __msfastcall

5
17 марта 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: GIZMO
см. __msfastcall


Не катит:

Цитата:

This calling convention emulates the Microsoft implementation of the fastcall calling convertion. The first two DWORD or smaller arguments are passed in ECX and EDX registers, all other arguments are passed from right to left. The called function is responsible for removing these arguments from the stack.

246
18 марта 2010 года
GIZMO
1.8K / / 30.07.2004
Цитата: hardcase
Не катит:


я ничего не гарантировал:)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог