Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата(Manve @ 25.8.2004, 09:04)
Как уже видно из описания, наиболее быстрым в данном случае является вызов __fastcall т.к. первые два параметра передаются через соответствующие регистры, а не через стек.

По-моему, вопрос был другой. Из уже готовой DLL-ки вызывать функции. Стало быть, они уже объявлены как __stdcall, или __pascal, или там еще как-то. Стало быть, к ним и нужно цепляться по их правилам.

Автор: Manve 25.8.2004, 10:24
Пост выше это я из статьи вырезал. smile.gif

Цитата

По-моему, вопрос был другой. Из уже готовой DLL-ки вызывать функции. Стало быть, они уже объявлены как __stdcall, или __pascal, или там еще как-то. Стало быть, к ним и нужно цепляться по их правилам.


Совершенно верно. Я так понимаяю что можно использовать __pascal в описании прототипа функции и работать с ней как с обычной функцией, а компилятор сам будет заниматься передачей параметров (или я что-то не так понимаю).

Автор: nas_alex 25.8.2004, 10:25
так я все таки не понял, как правильно вызвать ф-цию, которая была написана на DILFI?

Автор: srd 25.8.2004, 10:33
Схема такая:
Код

typedef void (__pascal *Func)(char *par1, char *par2, char *str, WORD kod);
......
HMODULE lib = LoadLibrary("путь и имя библиотеки");
...
Func func = (Func)GetProcAddress(lib, "имя функции");
...
func(параметры);
...
func = 0;
FreeLibrary(lib);

Правда я не знаю, что из себя представлят паскалевский тип string. Может быть он не совместим с char *.

Автор: nas_alex 25.8.2004, 10:49
Цитата(srd @ 25.8.2004, 10:33)
Схема такая:
Код

typedef void (__pascal *Func)(char *par1, char *par2, char *str, WORD kod);
......
HMODULE lib = LoadLibrary("путь и имя библиотеки");
...
Func func = (Func)GetProcAddress(lib, "имя функции");
...
func(параметры);
...
func = 0;
FreeLibrary(lib);

Правда я не знаю, что из себя представлят паскалевский тип string. Может быть он не совместим с char *.

ошибка выходит error C4226: nonstandard extension used : '__pascal' is an obsolete keyword

Автор: Yuri Burger 25.8.2004, 11:09
Цитата(Manve @ 24.8.2004, 18:11)
А зачем тебе компилить ее? Просто вызывай нужные функции из DLL.

не факт. если во вне выставлен плюсатый интерфейсто VC и Builder имеют разные схемы именования плюсатых функций.

Автор: Manve 25.8.2004, 11:26
Да но ведь DLL на делфе написана, хотя, в принципе, и там могут быть свои заморочки с именованием функций.

Автор: srd 25.8.2004, 12:51
Цитата
ошибка выходит error C4226: nonstandard extension used : '__pascal' is an obsolete keyword

c4226 - это не ошибка, а warning. У тебя наверное в настройках проекта стоит опция трактовать все варнинги как ошибки.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)