Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.02.2010, 11:24   #1
HollyPaladin
Пользователь
 
Аватар для HollyPaladin
 
Регистрация: 29.11.2009
Сообщений: 51
По умолчанию ProgressBar в dll

Мне необходимо написать функцию и поместить ее в dll, во время выполнения функции должна появляться форма с прогресбаром, который должен показывать на каком этапе выполнения находится функция.
Я сделал вот так:
Код функции
Код:
extern "C" Error_str __export MK1_Convert(double Sox,double Soy,Stik *Param)
{
 TForm2 *F= new TForm2(0);
 F->Show(); 
 while(условие)
 {
  Выполнение действий
  F->ProgressBar1->Position=i;
}
 F->Hide();
 F->Free();
}
Код загрузки dll
Код:
 Error_str (_stdcall *ups)(double Sox,double Soy,Stik *Param);
 ourdll = LoadLibrary("Project1.dll");
 if(ourdll)
 {
  ups =( Error_str(__stdcall *)(double Sox,double Soy,Stik *Param) )GetProcAddress(ourdll,"_MK1_Convert");
   if(ups)
   {
    Er=ups(0,0,&St);
   }
  }
 FreeLibrary(ourdll);
Этот код работает.
Но если много раз загружать функцию то выскакивает ошибка:
Project Project1.exe raised exception class EAccess violation with message
"Access violation at address 32665A01 in module CC3260MT.dll.Read address F8275580.Process stopped.Use step or run to continue.
CPU Window показывает комнду cmp dword ptr [eax +ebx*4],0x00.
При использование следующего кода ошибка выскакивает при i=45:
Код:
 Error_str (_stdcall *ups)(double Sox,double Soy,Stik *Param);
 ourdll = LoadLibrary("Project1.dll");
 if(ourdll)
 {
  ups =( Error_str(__stdcall *)(double Sox,double Soy,Stik *Param) )GetProcAddress(ourdll,"_MK1_Convert");
   if(ups)
   {
    for(int i=0;i<100;i++)
    {
     Caption = i;
     Er=ups(0,0,&St);
    }
   }
  }
 FreeLibrary(ourdll);
Подскажите как исправить эту ошибку.Пишу на C++ Builder 6.0.
HollyPaladin вне форума Ответить с цитированием
Старый 03.02.2010, 16:07   #2
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

А откуда взялся F->ProgressBar1? Попробуйте перед F->Free(); написать F->ProgressBar1->Free();
подпись
liljon вне форума Ответить с цитированием
Старый 03.02.2010, 16:24   #3
HollyPaladin
Пользователь
 
Аватар для HollyPaladin
 
Регистрация: 29.11.2009
Сообщений: 51
По умолчанию

liljon, F->ProgressBar1 находится на форме.
Попробовал вариант с F->ProgressBar1->Free()- не помогло.
HollyPaladin вне форума Ответить с цитированием
Старый 03.02.2010, 16:38   #4
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

что такое St в ups(0,0,&St)?
оба проекта в студию. Пологаю, что адресс выделеный памяти в приложении пытаеться освободиться в библиотеке, или наоброт.
подпись

Последний раз редактировалось liljon; 03.02.2010 в 16:42.
liljon вне форума Ответить с цитированием
Старый 04.02.2010, 10:30   #5
Modigar
Пользователь
 
Регистрация: 04.02.2010
Сообщений: 10
По умолчанию

в справке насчет Free() написано, что нельзя ее применять в C++
необходимо delete
Modigar вне форума Ответить с цитированием
Старый 04.02.2010, 10:46   #6
HollyPaladin
Пользователь
 
Аватар для HollyPaladin
 
Регистрация: 29.11.2009
Сообщений: 51
По умолчанию

Modigar,при замене F->Free() на delete [] F выдало ошибку Abnormal program termination.
liljon, St это структура в с входными данными для функции.
Выкладываю проекты.
Вложения
Тип файла: rar MK1Convert.rar (42.7 Кб, 18 просмотров)
Тип файла: rar LoadDLL.rar (97.3 Кб, 16 просмотров)
HollyPaladin вне форума Ответить с цитированием
Старый 04.02.2010, 10:48   #7
Modigar
Пользователь
 
Регистрация: 04.02.2010
Сообщений: 10
По умолчанию

Код:
TForm2 *F= new TForm2(0);
.........
........
delete F; //без всяких скобок "[]"
Ps: везде Free() заменить на delete
PSPS: если у дочернего компонента указан Owner тогда удалять его не обязательно, достаточно удалить родителя, родитель удалит все дочерние автоматом.

Последний раз редактировалось Modigar; 04.02.2010 в 11:04.
Modigar вне форума Ответить с цитированием
Старый 04.02.2010, 11:02   #8
HollyPaladin
Пользователь
 
Аватар для HollyPaladin
 
Регистрация: 29.11.2009
Сообщений: 51
По умолчанию

Modigar,сделал без скобок - выскакивает та же ошибка что и с Free.
HollyPaladin вне форума Ответить с цитированием
Старый 04.02.2010, 11:11   #9
Modigar
Пользователь
 
Регистрация: 04.02.2010
Сообщений: 10
По умолчанию

Цитата:
Сообщение от HollyPaladin Посмотреть сообщение
Modigar,сделал без скобок - выскакивает та же ошибка что и с Free.
Отладчиком тогда смотри на какой строке в dll падает
Modigar вне форума Ответить с цитированием
Старый 04.02.2010, 11:15   #10
HollyPaladin
Пользователь
 
Аватар для HollyPaladin
 
Регистрация: 29.11.2009
Сообщений: 51
По умолчанию

Modigar,а как отладчиком смотреть код dll из проекта загружающего dll?
HollyPaladin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при выхове функций Bass.dll из другой DLL SalasAndriy Общие вопросы Delphi 7 21.10.2009 23:36
ProgressBar Andrei Isaev Общие вопросы Delphi 1 20.11.2008 14:59
ProgressBar Makarov Компоненты Delphi 3 04.02.2008 22:42
ProgressBar pentiumForever Компоненты Delphi 2 07.09.2007 13:33