| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > DLL |
| Автор: nas_alex 24.8.2004, 17:46 |
| каким образом перекомпилить DLL, которая была написана на Bulder, чтобы ее можно было использовать в VC6? |
| Автор: Manve 24.8.2004, 18:11 |
| А зачем тебе компилить ее? Просто вызывай нужные функции из DLL. |
| Автор: nas_alex 25.8.2004, 08:03 |
| я ошибся, DLL написана на DELFI, мне сказали, что так просто нельзя вызвать, что там другой порядок передачи параметров. функции имеет параметры: (par1 string,par2 string,str pchar,kod word), как ее правильно вызвать? |
| Автор: Peter 25.8.2004, 09:00 |
| Другой порядок - это в смысле не __cdecl, а __pascal? |
| Автор: Manve 25.8.2004, 09:04 |
| Вот читай: __cdecl - стандартный вызов в Си. Параметры передаются через стек, справа налево, то есть первый параметр ляжет в стек последним. Вызывающая функция (та, из которой был инициирован вызов) "правит" стек. __stdcall - стандартный вызов Win32 функций - большая часть функций ядра windows используют именно его. Параметры передаются через стек справа налево. Вызываемая функция правит стек. __pascal - стандартный вызов в языке Pascal. Параметры передаются через стек слева направо. Вызываемая процедура правит стек. __thiscall - стандартный вызов языка C++. Параметры передаются через стек справа налево. В регистре ECX передается указатель this. Вызывающая функция правит стек. __fastcall - вызов используемый Borland C Builder и Delphi. Первый и второй параметры передаются в паре регистров ECX и EDX, остальные - через стек справа налево. Вызываемая функция правит стек Как уже видно из описания, наиболее быстрым в данном случае является вызов __fastcall т.к. первые два параметра передаются через соответствующие регистры, а не через стек. |
| Автор: Peter 25.8.2004, 09:16 | ||
По-моему, вопрос был другой. Из уже готовой DLL-ки вызывать функции. Стало быть, они уже объявлены как __stdcall, или __pascal, или там еще как-то. Стало быть, к ним и нужно цепляться по их правилам. |
| Автор: Manve 25.8.2004, 10:24 | ||
Пост выше это я из статьи вырезал.
Совершенно верно. Я так понимаяю что можно использовать __pascal в описании прототипа функции и работать с ней как с обычной функцией, а компилятор сам будет заниматься передачей параметров (или я что-то не так понимаю). |
| Автор: nas_alex 25.8.2004, 10:25 |
| так я все таки не понял, как правильно вызвать ф-цию, которая была написана на DILFI? |
| Автор: srd 25.8.2004, 10:33 | ||
Схема такая:
Правда я не знаю, что из себя представлят паскалевский тип string. Может быть он не совместим с char *. |
| Автор: nas_alex 25.8.2004, 10:49 | ||||
ошибка выходит error C4226: nonstandard extension used : '__pascal' is an obsolete keyword |
| Автор: Yuri Burger 25.8.2004, 11:09 | ||
не факт. если во вне выставлен плюсатый интерфейсто VC и Builder имеют разные схемы именования плюсатых функций. |
| Автор: Manve 25.8.2004, 11:26 |
| Да но ведь DLL на делфе написана, хотя, в принципе, и там могут быть свои заморочки с именованием функций. |
| Автор: srd 25.8.2004, 12:51 | ||
c4226 - это не ошибка, а warning. У тебя наверное в настройках проекта стоит опция трактовать все варнинги как ошибки. |