Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Описание и вызов функции из Dll, Помогите 
:(
    Опции темы
Любаша
Дата 16.1.2007, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В Dll файле есть функция
float COMCOM(float re_1,float re_2,float im_1,float im_2)
{float rez_re,rez_im;
rez_re = re_1 - re_2;
rez_im = im_1 - im_2;
return rez_re,rez_im;};
Каким образом ее объявить и вызвать в программе. Я никак не могу разобраться как их объявлять, эти функции. Какой type объявлять… ничего не понимаю!!! ПОМОГИТЕ ПОЖАЛУЙСТА! 

PM MAIL   Вверх
stmamont
Дата 17.1.2007, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



файл Dll.def нужно подключить к проекту библиотеки
Код

LIBRARY     SIMPLEDLL.DLL

EXPORTS
    _COMCOM           @1   ; _COMCOM
    ___CPPdebugHook                @2   ; ___CPPdebugHook



файл Dll.cpp - "главный" файл библиотеки
Код

extern "C"
{
    float  COMCOM(float re_1,float re_2,float im_1,float im_2);
}

float  COMCOM(float re_1,float re_2,float im_1,float im_2)
{                 
 // ... код
}


файл getfromdll.cpp - часть кода где вызывается функция из dll
Код

typedef float (*func)(float re_1,float re_2,float im_1,float im_2);
HINSTANCE Dll = ::LoadLibrary("simple.dll");
func modFunc = 0;
modFunc = (func)::GetProcAddress(Dll , "_COMCOM");
// используем функцию
float x = modFunc(1 , 2 , 33 , 4);
if(modFunc == 0)
{
  ::FreeLibrary(Dll);
}


так должно быть получше...


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


Новичок



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

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



[C++ Warning] Unit1.cpp(30): W8004 'modFunc' is assigned a value that is never used
[C++ Error] Unit1.cpp(45): E2268 Call to undefined function 'modFunc'
[C++ Error] Unit1.cpp(48): E2451 Undefined symbol 'Dll'
почему такие гадости. если подключать Dll и функции из него при помощи одной кнопки а вызывать их при помощи другой
Код

void __fastcall TForm1::Button4Click(TObject *Sender)
{HINSTANCE Dll = LoadLibrary("dll.dll");
if (Dll)
  {  ShowMessage("Dll загружен динамически");  }
else
 ShowMessage("не удалось загрузить Dll файл");
 func modFunc = 0;
 modFunc = (func)::GetProcAddress(Dll , "_COMCOM");}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{float re_1;
float re_2;
float im_2;
float im_1;
AnsiString st;
re_1 = StrToFloat(Form1->Edit1->Text);
re_2 = StrToFloat(Form1->Edit2->Text);
im_1 = StrToFloat(Form1->Edit3->Text);
im_2 = StrToFloat(Form1->Edit4->Text);
st = modFunc(re_1,re_2,im_1,im_2);
ShowMessage("комплексное число = " + st);
if(modFunc == 0)
  ::FreeLibrary(Dll);}

а если все прописать для одной кнопки то нормально
PM MAIL   Вверх
Anikmar
Дата 17.1.2007, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Так неправильно:
Код

void __fastcall TForm1::Button4Click(TObject *Sender)
{HINSTANCE Dll = LoadLibrary("dll.dll");
if (Dll)
  {  ShowMessage("Dll загружен динамически");  }
else
 ShowMessage("не удалось загрузить Dll файл");
 func modFunc = 0;
 modFunc = (func)::GetProcAddress(Dll , "_COMCOM");}


У тебя область видимости ограничена методом кнопки!
Инициализация библиотеки должна быть там, где все найденные методы и сам хандлер библиотеки видны из всех необходимых мест и живут все необходимое время.

А так, получается, что после отработки вышеуказанного кода - все объявленные в стеке переменные исчезнут.
PM MAIL ICQ   Вверх
Любаша
Дата 17.1.2007, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Тогда каким образом? Каждый раз подключать Dll что-ли. У меня есть прога, так там по нажатию одной кнопки подгружается Dll, а по другой функции из него но как? У меня же несколько функции и несколько кнопок(на каждую функцию).
PM MAIL   Вверх
Anikmar
Дата 17.1.2007, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Любаша @  17.1.2007,  12:43 Найти цитируемый пост)
Тогда каким образом?

Например, инициализируй DLL в конструкторе формы, а переменные типа 
HINSTANCE Dll
func modFunc
Сделай членами класса.
Если в проге только 1 форма можно разместить в ней.
Если форм много, то можно создать глобальный объект собственного класса, в котором можно держать все глобальные переменные.
Можно просто глобальными переменными (многими считается некорректным с точки зрения ООП подходом)
Приложение запускается, инициализирует DLL, далее происходит работа с ней, перед выходом - освобождается.

Если DLL нужна только на отдельном участке программы - тогда можно инициализовать в конструкторе формы, использующей библиотеку.

Все зависит от конкретных задач.



PM MAIL ICQ   Вверх
Любаша
Дата 17.1.2007, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я конечно все понимаю, но с С++ Builder-oм встретилась 2 недели назад. подскажите как попроще!
На форме три кнопки, как для каждой подключить функцию из Dll(Dll подключается отдельной кнопкой).   
PM MAIL   Вверх
Anikmar
Дата 17.1.2007, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



В описании класса формы в разделе protected: добавь две переменные:
HINSTANCE Dll;
func modFunc;

Там же в h файле (выше объявления класса формы укажи все типы используемых из DLL функций, здесь ты использовала пока только одну:
typedef float (*func)(float re_1,float re_2,float im_1,float im_2);

В конструкторе формы или в обработчике события FormCreate напиши код инициализации DLL:
Код

modFunc = NULL;
Dll = LoadLibrary("dll.dll");
if (Dll)  
 {  
  ShowMessage("Dll загружен динамически");  
  modFunc = (func)::GetProcAddress(Dll , "_COMCOM");  
  }
else
{
 ShowMessage("не удалось загрузить Dll файл");
Close(); // Закрываем форму - так как DLL не работает
 }



В обработчике OnClose напиши функцию освобождения от DLL
Код

if (Dll) FreeLibrary(Dll);


В обработчиках кнопок вызывай modFunc как тебе угодно

Добавлено @ 13:13 
При моем подходе кнопка подключения DLL будет не нужна.
Если хочешь подключать именно по кнопке - значит перенеси код из конструктора в кнопку, а в конструкторе только оставь строку
Dll = 0; - Чтобы по умолчанию считалось, что DLL не загружена
PM MAIL ICQ   Вверх
Любаша
Дата 17.1.2007, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



большое спасибо. буду пробовать.

PM MAIL   Вверх
Любаша
Дата 17.1.2007, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Огромное всем СПАСИБО.
ВСЕ ПОЛУЧИЛОСЬ!!!
PM MAIL   Вверх
koza
Дата 12.2.2007, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Не понятно
А как потом пользоваться этим указателем modFunc на функцию??
PM MAIL ICQ   Вверх
stmamont
Дата 12.2.2007, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



koza, так же как и обычным именем функции


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


Новичок



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

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



Короче, пятый день с этими дллками мучуусь, а ничего не работает  smile 
Может есь у кого нормально работающий пример (исходники)?
PM MAIL ICQ   Вверх
stmamont
Дата 12.2.2007, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Выше в этой теме были написаны примеры, осталось файлы создать и откомпилить))


--------------------
user posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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