Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: как правильно обратиться к dll?  (Прочитано 8175 раз)
0 Пользователей и 1 Гость смотрят эту тему.
zuuuuk
Постоялец

ru
Offline Offline

« : 21-06-2013 05:42 » 

Добрый день. Посоветуйте, пожалуста, что делать?
У меня по нажатию кнопки происходит загрузка dll
И вызов из нее функции.
Функция выполняет свои действия без ошибок.
Но по  выходу из void __fastcall TForm1::Button1Click(TObject *Sender)
происходит ошибка.



dll.h
Код: (C++)
typedef void (*func3)(char,char *);
static func3 ZahvatUstroistva;

.cpp
Код: (C++)

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   hD = LoadLibrary ("Bi30Usb.dll");
   hDll = LoadLibrary ("Bi30Func.dll");
   if (hDll)
   {
    ZahvatUstroistva = (func3) GetProcAddress (hDll, "ZahvatUstroistva");
   }
   else {
   Application ->MessageBoxA("ошибка", 0,0);
      return;
   }

    ZahvatUstroistva(0, &KodOshibki);
    if (KodOshibki != 0){
    Application-> MessageBoxA("ошибка", 0, 0);
    }


}
Записан
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #1 : 21-06-2013 05:49 » 

Обрати внимание на параметры, которые ты передаешь в функцию ZahvatUstroistva. Похоже проблема внутри функции из за неверных параметров.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 21-06-2013 06:46 » 

И закрытие дескрипторов тоже надо. FreeLibrary там...
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
zuuuuk
Постоялец

ru
Offline Offline

« Ответ #3 : 21-06-2013 07:12 » 

Функцию и длл писал другой человек. Но он оставил документацию и пример.
Параметры в функцию я передаю так же как и в примере.
только пример на паскале.

добавил FreeLibrary
Код: (C++)
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   hD = LoadLibrary ("Bi30Usb.dll");
   hDll = LoadLibrary ("Bi30Func.dll");
   if (hDll)
   {
    ZahvatUstroistva = (func3) GetProcAddress (hDll, "ZahvatUstroistva");
   }
   else {
   Application ->MessageBoxA("îøèáêà", 0,0);
   }

    ZahvatUstroistva(0, &KodOshibki);
    if (KodOshibki != 0){
    Application-> MessageBoxA("êîä", 0, 0);
    }
     FreeLibrary (hD);
     FreeLibrary (hDll);

}

не помогло.

Добавлено через 7 минут и 11 секунд:
А вот если я все это помещу в фунцию при создании формы
то все нормально выполняется.

Код: (C++)
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  hD = LoadLibrary ("Bi30Usb.dll");
   hDll = LoadLibrary ("Bi30Func.dll");
   if (hDll)
   {
    ZahvatUstroistva = (func3) GetProcAddress (hDll, "ZahvatUstroistva");
   }
   else {
   Application ->MessageBoxA("îøèáêà", 0,0);
   }

    ZahvatUstroistva(0, &KodOshibki);
    if (KodOshibki != 0){
    Application-> MessageBoxA("êîä", 0, 0);
    }
     //FreeLibrary (hD);
     //FreeLibrary (hDll);

}

Приложение запускается без ошибок.

я не понимаю почему.
« Последнее редактирование: 21-06-2013 07:20 от zuuuuk » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 21-06-2013 07:24 » 

Отладчиком пройдись. GetProcAddress возвращает правильный указатель?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

Хз, я не очень просто не очень во всё это верю, во всякие там сатурны и прочую поебень.
zuuuuk
Постоялец

ru
Offline Offline

« Ответ #5 : 21-06-2013 07:32 » 

ZahvatUstroistva не равен 0.


Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #6 : 21-06-2013 07:34 » 

Функцию и длл писал другой человек. Но он оставил документацию и пример.
Параметры в функцию я передаю так же как и в примере.
только пример на паскале.
в паскале порядок передачи параметров отличается от C.
Записан
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #7 : 21-06-2013 07:58 » 

Паскальный прототип в студию.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 21-06-2013 09:59 » 

Поддерживаю вопрос: прототипы и соглашения по вызовам: cdecl/stdcall/pascal/fastcall.

1. Какое соглашение у BCB по умолчанию?
2. В dll.h указана обертка extern "C"?
3. Язык, использованный для написания dll?

памятка
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

Хз, я не очень просто не очень во всё это верю, во всякие там сатурны и прочую поебень.
zuuuuk
Постоялец

ru
Offline Offline

« Ответ #9 : 21-06-2013 15:12 » 

язык написания Bi30Func.dll паскаль.

Вообще, вы, меня натолкнули на очень важную важную часть
на которую я не обратил внимание.
Проверяю.....
Записан
zuuuuk
Постоялец

ru
Offline Offline

« Ответ #10 : 04-07-2013 10:03 » 

RXl,
что такое соглашение у ВСВ?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 04-07-2013 10:13 » 

Термин «соглашение по вызовам», надеюсь, тебе известен.
BCB — сокращение от Borland C++ Builder.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

Хз, я не очень просто не очень во всё это верю, во всякие там сатурны и прочую поебень.
zuuuuk
Постоялец

ru
Offline Offline

« Ответ #12 : 04-07-2013 10:36 » 

Понятно. Уточнил просто.

У меня так и не получается вызвать функции из длл безпоявления ошибки.
 
Длл написан на паскале.
обрамление extern "C" есть.

* df.part02.rar (488.28 Кб - загружено 129 раз.)
* df.part01.rar (488.28 Кб - загружено 123 раз.)
* df.part03.rar (220.66 Кб - загружено 136 раз.)
Записан
LemmonRus
Помогающий

ru
Offline Offline
В правильно заданном вопросе 90% ответа.


« Ответ #13 : 04-07-2013 10:56 » 

Понятно. Уточнил просто.

У меня так и не получается вызвать функции из длл безпоявления ошибки.
 
Длл написан на паскале.
обрамление extern "C" есть.

Изучай Name mangling.

Самое простое :
1)качаешь dependency walker c http://www.dependencywalker.com/
2)открываешь в нем dll.
3)Смотришь таблицу экспорта.
4)изменяешь название запрашиваемой функции дабы совпадало с названием в DLL.
Записан
zuuuuk
Постоялец

ru
Offline Offline

« Ответ #14 : 04-07-2013 11:22 » 

Я поставил в настройках проекта компиляции.
стандартные вызовы.
все заработало.
огромное вам всем спасибо.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 04-07-2013 13:52 » new

На весь проект ставить некошерно. Определение соглашения для данных функций должно быть в заголовочном файле.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

Хз, я не очень просто не очень во всё это верю, во всякие там сатурны и прочую поебень.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines