Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DLL, каким образом перекомпилить DLL 
:(
    Опции темы
nas_alex
  Дата 24.8.2004, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 8.6.2004

Репутация: нет
Всего: нет



каким образом перекомпилить DLL, которая была написана на Bulder, чтобы ее можно было использовать в VC6?


PM MAIL   Вверх
Manve
Дата 24.8.2004, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 30.7.2004

Репутация: нет
Всего: 1



А зачем тебе компилить ее? Просто вызывай нужные функции из DLL.
PM   Вверх
nas_alex
Дата 25.8.2004, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 8.6.2004

Репутация: нет
Всего: нет



я ошибся, DLL написана на DELFI, мне сказали, что так просто нельзя вызвать, что там другой порядок передачи параметров.

функции имеет параметры: (par1 string,par2 string,str pchar,kod word), как ее правильно вызвать?
PM MAIL   Вверх
Peter
Дата 25.8.2004, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 28.7.2003
Где: Ставрополь

Репутация: -1
Всего: 1



Другой порядок - это в смысле не __cdecl, а __pascal?


--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
Manve
Дата 25.8.2004, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 30.7.2004

Репутация: нет
Всего: 1



Вот читай:
__cdecl - стандартный вызов в Си. Параметры передаются через стек, справа налево, то есть первый параметр ляжет в стек последним. Вызывающая функция (та, из которой был инициирован вызов) "правит" стек.
__stdcall - стандартный вызов Win32 функций - большая часть функций ядра windows используют именно его. Параметры передаются через стек справа налево. Вызываемая функция правит стек.
__pascal - стандартный вызов в языке Pascal. Параметры передаются через стек слева направо. Вызываемая процедура правит стек.
__thiscall - стандартный вызов языка C++. Параметры передаются через стек справа налево. В регистре ECX передается указатель this. Вызывающая функция правит стек.
__fastcall - вызов используемый Borland C Builder и Delphi. Первый и второй параметры передаются в паре регистров ECX и EDX, остальные - через стек справа налево. Вызываемая функция правит стек
Как уже видно из описания, наиболее быстрым в данном случае является вызов __fastcall т.к. первые два параметра передаются через соответствующие регистры, а не через стек.
PM   Вверх
Peter
Дата 25.8.2004, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 28.7.2003
Где: Ставрополь

Репутация: -1
Всего: 1



Цитата(Manve @ 25.8.2004, 09:04)
Как уже видно из описания, наиболее быстрым в данном случае является вызов __fastcall т.к. первые два параметра передаются через соответствующие регистры, а не через стек.

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


--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
Manve
Дата 25.8.2004, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 30.7.2004

Репутация: нет
Всего: 1



Пост выше это я из статьи вырезал. smile.gif

Цитата

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


Совершенно верно. Я так понимаяю что можно использовать __pascal в описании прототипа функции и работать с ней как с обычной функцией, а компилятор сам будет заниматься передачей параметров (или я что-то не так понимаю).
PM   Вверх
nas_alex
Дата 25.8.2004, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 8.6.2004

Репутация: нет
Всего: нет



так я все таки не понял, как правильно вызвать ф-цию, которая была написана на DILFI?
PM MAIL   Вверх
srd
Дата 25.8.2004, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Схема такая:
Код

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 *.



--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
nas_alex
Дата 25.8.2004, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 8.6.2004

Репутация: нет
Всего: нет



Цитата(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
PM MAIL   Вверх
Yuri Burger
Дата 25.8.2004, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 11.5.2004

Репутация: нет
Всего: нет



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

не факт. если во вне выставлен плюсатый интерфейсто VC и Builder имеют разные схемы именования плюсатых функций.
PM MAIL   Вверх
Manve
Дата 25.8.2004, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 30.7.2004

Репутация: нет
Всего: 1



Да но ведь DLL на делфе написана, хотя, в принципе, и там могут быть свои заморочки с именованием функций.
PM   Вверх
srd
Дата 25.8.2004, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



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

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


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0644 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.