__thiscall и C++ Builder
Visual Studio поддерживает __thiscall:
Код:
typedef void (__thiscall *SomeFunc) (int Pointer);
Builder же директиву __thiscall не понимает вообще. Интересует есть ли обходные варианты тк пересаживаться на другую среду ради одной директивы как то не хочется. Можно ли как то самому указать что какой то параметр должен передаваться через регистр такой то.
П.С. Нужно для взаимодействия с чужим классом(не COM, и исходников нет).
Ну самый очевидный вариант - использование ассемблерной вставки. Кроме того, начиная с 2006 вроде как Borland подерживает данное соглашение (за точность не ручаюсь - у точните у тех кто использует в работе).
Цитата: Miatar
Нужно для взаимодействия с чужим классом(не COM, и исходников нет).
COM хотя бы бинарный стандарт, а вот уверены ли вы в том что VC++ и Builder помимо __thiscall будут бинарно совместимы? Я про использование VCшного класса "напрямую" в Builder.
Что касается поддержки класса, то на 90% уверен.
Цитата: Miatar
Стоит С++ Builder 2010, и thiscall он не знает.
Что касается поддержки класса, то на 90% уверен.
Что касается поддержки класса, то на 90% уверен.
Странно.
Ну тогда используйте асм.
Цитата: kot_
Странно.
Ну тогда используйте асм.
Ну тогда используйте асм.
Действительно, соглашение __thiscall не поддерживается C++Builder-ом, и вообще это соглашение по-разному воспринимается компиляторами. Ссылка на Вики.
Цитата: Miatar
Во общем интересует - есть ли какие либо варианты в C++ Builder. Нужно для того, что бы указатель на класс передавался через регистр ECX, тк указатели на классы в C++ builder передаются через стек, либо вообще все передается через регистр(fastcall).
Visual Studio поддерживает __thiscall:
Builder же директиву __thiscall не понимает вообще. Интересует есть ли обходные варианты тк пересаживаться на другую среду ради одной директивы как то не хочется. Можно ли как то самому указать что какой то параметр должен передаваться через регистр такой то.
П.С. Нужно для взаимодействия с чужим классом(не COM, и исходников нет).
Visual Studio поддерживает __thiscall:
Код:
typedef void (__thiscall *SomeFunc) (int Pointer);
Builder же директиву __thiscall не понимает вообще. Интересует есть ли обходные варианты тк пересаживаться на другую среду ради одной директивы как то не хочется. Можно ли как то самому указать что какой то параметр должен передаваться через регистр такой то.
П.С. Нужно для взаимодействия с чужим классом(не COM, и исходников нет).
см. __msfastcall
Цитата: 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.
Цитата: hardcase
Не катит:
я ничего не гарантировал:)