![]() |
|
|
![]()
|
|
| borisbn |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 18 Всего: 135 |
День добрый. Столкнулся с такой проблемой: имеется абстрактный интерфейс
наследуюсь от него и реализую функции:
создаю dll-ку с одной функцией на M$-VC 2008, в которую передаю этот интерфейс
создаю экземпляр Pack и передаю его в dll-ку
теперь самое интересное: builder'овский и visul'овский printf'ы печатают разный this, если в настройках проекта builder'а в Project/Options/Advanced Compiler/Calling convention стоит "C", а в MSVC - __cdecl. Если же в явном виде прописать
то всё работает. Подскажите, пожалуйста, что это за тип вызова "C" в Builder'е ? Проблема усугубляется тем, что я не могу менять этот интерфейс, т.к. он уже используется в пол-сотне проектах. Спасибо. Это сообщение отредактировал(а) borisbn - 13.7.2010, 06:50 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||||||
|
|||||||||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 14 Всего: 39 |
это соглашения вызова для функций, если необходимо экспортировать функции из DLL для других разработчиков, делай стандартное соглашение вызова __stdcall, либо указывай сторонним разработчикам что они для вызова твоих функций должны использовать соглашение вызова __cdecl, хотя это не правильно. Это я к тому что не так давно мне пришлось прикручивать вызов своих функций как __fastcall - чисто борманавская реализация вызова, собственно хорошо что у меня был компилятор от бормана и я смог в исходнике задать тип вызова и откомпелировать код, еслибы у меня была только Visual Studio то я бы это сделать не смог бы.
Так что думай какую ты подл....ку сделаешь остальным. Это сообщение отредактировал(а) Dem_max - 13.7.2010, 07:09 -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 18 Всего: 135 |
Dem_max,
1.
2. В студии указан тип вызова __cdecl 3. (немного не в тему) в студии тоже есть __fastcall, но он отличается от builder'овского ( используются разные регистры ) -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Dem_max |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 14 Всего: 39 |
у тебя все равно все экспортируемые функции идут как CALL_TYPE так замени #define CALL_TYPE __cdecl на #define CALL_TYPE __stdcall если же у тебя
то экспортируй правильно
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
||||||
|
|||||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 18 Всего: 135 |
Dem_max, дело в том, что CALL_TYPE я здесь специально добавил. в самом интерфейсе его нет, а менять интерфейс я никак не могу ( куча проектов уже использует dll-ки c этим интерфейсом ).
А функцию foo я просто так привёл. на самом деле у меня из visual'а экспортируется интерфейс, в котором все функции с явным типом вызова. Проблема в том, что я никак не могу понять, что это за тип вызова в настройках builder'а ( Project/Options/Advanced Compiler/Calling convention ) "C" ? P.S. __stdcall, хоть и называется standard call не является таковым, т.к. для Си стандартным является __cdecl, мало того, в некоторых компиляторах он является единственным, и указать __stdcall нельзя. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Dem_max |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 14 Всего: 39 |
Ах ты про это, да это __cdecl
Тогда те программы не смогут подгружать стандартные виндовозовские DLL Это сообщение отредактировал(а) Dem_max - 13.7.2010, 11:27 -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
||||||
|
|||||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 18 Всего: 135 |
Разобрался. Но только с Builder'ом. Он реабилитирован
Сделал следующее: в h-нике, который подключаю в студии явно указал тип вызова __cdecl, а в builder'е оставил без оного. И всё заработало правильно. Странно, но в настройках проекта студии Project/Properties/C/C++/Advanced/Calling Convention стоит __cdecl (/Gd). Но это вопрос в другой форум. P.S.
А я не говорил о windows'овских компиляторах. g++ 4.1.2, например, не понимает. Но это тоже в другой форум -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |