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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> создание и работа dll 
:(
    Опции темы
FortMax
  Дата 9.10.2009, 07:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 2.10.2006
Где: Россия, г. Бироби джан ЕАО

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



Доброго времени суток =)

Кто-нибудь(т.е. не яндек, не гугл) может на пальцах (на простом примере) обьяснить как создавать и работать с dll ??? smile 


--------------------
user posted image
PM MAIL ICQ   Вверх
t_gran
Дата 9.10.2009, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

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



Я так понимаю вам нужно на самом простом примере. Если я вас правильно понял, то давайте разбирём наипростейшый пример. Компилятор GCC, платформа Windows. DLL будет содиржать всего 2 простейшие ф-ии, а-ля паскаль, inc и dec (что соответственно инкремент и декремент целого числа).

library.h
Код

__declspec(dllexport) int inc(int *d)
{
   return ++(*d);
}
//----------------------------------------------//
__declspec(dllexport) int dec(int *d)
{
   return --(*d);
}


Как видно из примера, ничего нового, кроме __declspec(dllexport) - так мы указываем компилятору, что эти данные необходимо поместить в секцию экспорта.

Компилируем:
Код

> gcc -s -O2 --shared library.c -o library.dll


где:
   -s - удалить отладочную информацию,
   -O2 - оптимизация 2-го уровня,
   -- shared - компилировать динамическую библиотеку.

В результате получаем библиотеку library.dll

Теперь пишем тестовую программу

test.c
Код

#include <windows.h>

typedef int (*TInc)(int *);
typedef int (*TDec)(int *);

int main (int argc, char **argv)
{
   HMODULE h= LoadLibrary("library.dll");
   if (!h)
   {
      printf("Error: \'library.dll\' not found ...");
      return 1;
   }
   TInc inc= (TInc) GetProcAddress(h, "inc");
   TDec dec= (TDec) GetProcAddress(h, "dec");
   if (inc && dec)
   {
      int x= 10;
      printf("x= %d\n", x);
      printf("inc(x)= %d\n", inc(&x));
      printf("dec(x)= %d\n", dec(&x));
   }
   FreeLibrary(h);
   return 0;
}


Т.к. пишем под винду, то соответственно используем API-функции. В нашем случае это:
1. LoadLibrary - загрузить.
2. GetProcAddress - получить адрес конструкции.
3. FreeLibrary - закрыть (освободить) библиотеку.

Компилируем обычно:
Код

> gcc -s -O2 test.c -o test.exe


P.S.: Как-то так. smile. Если, что-то не понятно, спрашивайте.

P.P.S: Это самый примитивнейший пример, и не является панацеей.

Отличная статья

Это сообщение отредактировал(а) t_gran - 9.10.2009, 08:32


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
Gugle
Дата 7.10.2011, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго времени суток!

Поднимаю этот вопрос, т.к. схожа.

Взял ваш код за исходный для создания dll на Си. Все собралось, dll получилась. Проверку на Си проходит, т.е. все возвращает прально, но при попытке использовать dll с другими языками, например с delphi, вываливается с ошибкой:
Код

Access violation at address 931... in modul testdll.dll. Write of address 0000000A.

Подскажите почему? Может для этого входные переменные в dll надо как то по другому объявлять?
PM MAIL   Вверх
math64
Дата 7.10.2011, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



У Delphi и C разные соглашения о передаче параметров: в Delphi (pascal'e) параметры памещаются в стек начиная с первого, а из стека их освобождает вызывающая программа,
в C параметры памещаются в стек начиная с последнего, а освобождает их вызывающая программа, что позволяет писать функции типа printf(fmt, ...);
Нужно либо в dll объявить, что функция будет вызываться из паскаля 
Код

__declspec(dllexport) pascal int inc(int *d)

либо в Delphi объявить, что функция написана на C
PM   Вверх
bems
Дата 12.10.2011, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

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



Цитата(math64 @  7.10.2011,  13:57 Найти цитируемый пост)
в Delphi (pascal'e) параметры памещаются в стек начиная с первого, а из стека их освобождает вызывающая программа,
вызываемая. плюс кроме стека используются регистры



--------------------
Обижено школьников: 8
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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