Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Динамические объекты в *.dll

11
24 октября 2007 года
oxotnik333
2.9K / / 03.08.2007
Раньше не работал с dll, однако возникла необходимость...
вобщем ситуация такая:
в приложении была некая (рабочая) ф-я в которой динамически создавались объекты:
 
Код:
void TMainForm::CreateTreeView (void)
{
  TADOStoredProc *Qu = new TADOStoredProc(this);
  ...
  ...
  ...
  delete Qu;
}

хочу перенести эту ф-ю в dll, но возникла загвоздка, что вместо "this" ставить?
11
24 октября 2007 года
oxotnik333
2.9K / / 03.08.2007
выкрутился вот так:
auto_ptr<TADOStoredProc>Qu(new TADOStoredProc(NULL));

ПЫСЫ: извините что сам с собой разговариваю :)
240
24 октября 2007 года
aks
2.5K / / 14.07.2006
Пересмотреть архитектуру. Вынести подобные вещи в отдельную сущность за пределы класса. Организовать фабрикой например. ПРи необходимости передавать в функцию указатель на класс родительского окна (той самой мэйнформы например.)
11
24 октября 2007 года
oxotnik333
2.9K / / 03.08.2007
еще один вопрос:
есть главная форма, на ней TTreeView, хочу сделать так, что бы MainForm->TreeView заполнялось ф-ей из dll:
Код:
extern "C" void __export CreateTreeView (TADOStoredProc *ADOStoredProc1, TADOConnection *ADOConnection1, TTreeView *TreeView)
{
  TTreeNode *Node;
  ADOStoredProc1->Parameters->Clear();
  ADOStoredProc1->Active = false;
  ADOStoredProc1->Connection = ADOConnection1;

  ADOStoredProc1->ProcedureName = "Create_TV";
  ADOStoredProc1->Parameters->CreateParameter("@ItemLevel", ftInteger, pdInput, 4,  0);
  ADOStoredProc1->Parameters->ParamByName("@ItemLevel")->Value = 0;
  ADOStoredProc1->Active = true;

  while (!ADOStoredProc1->Eof)
        {
          int  id = ADOStoredProc1->FieldValues["IDKey"].intVal;
          TTreeNode *Nod = TreeView->Items->Add(NULL, ADOStoredProc1->FieldByName("ItemName")->AsString);
          Nod->Data = (void*)(int)id;
          CreateChildNode(id, Nod, TreeView, ADOConnection1);
          ADOStoredProc1->Next();
        }
  ADOStoredProc1->Active = false;
}

в строке TTreeNode *Nod = TreeView->Items->Add(NULL, ADOStoredProc1->FieldByName("ItemName")->AsString); вылетает AV по адресу...
ADOStoredProc1->FieldByName("ItemName")->AsString - нормально работает
как правильно передеать объект в ф-ю dll
1
24 октября 2007 года
kot_
7.3K / / 20.01.2000
Цитата: oxotnik333
еще один вопрос:
есть главная форма, на ней TTreeView, хочу сделать так, что бы MainForm->TreeView заполнялось ф-ей из dll:
Код:
extern "C" void __export CreateTreeView (TADOStoredProc *ADOStoredProc1, TADOConnection *ADOConnection1, TTreeView *TreeView)
{
  TTreeNode *Node;
  ADOStoredProc1->Parameters->Clear();
  ADOStoredProc1->Active = false;
  ADOStoredProc1->Connection = ADOConnection1;

  ADOStoredProc1->ProcedureName = "Create_TV";
  ADOStoredProc1->Parameters->CreateParameter("@ItemLevel", ftInteger, pdInput, 4,  0);
  ADOStoredProc1->Parameters->ParamByName("@ItemLevel")->Value = 0;
  ADOStoredProc1->Active = true;

  while (!ADOStoredProc1->Eof)
        {
          int  id = ADOStoredProc1->FieldValues["IDKey"].intVal;
          TTreeNode *Nod = TreeView->Items->Add(NULL, ADOStoredProc1->FieldByName("ItemName")->AsString);
          Nod->Data = (void*)(int)id;
          CreateChildNode(id, Nod, TreeView, ADOConnection1);
          ADOStoredProc1->Next();
        }
  ADOStoredProc1->Active = false;
}

в строке TTreeNode *Nod = TreeView->Items->Add(NULL, ADOStoredProc1->FieldByName("ItemName")->AsString); вылетает AV по адресу...
ADOStoredProc1->FieldByName("ItemName")->AsString - нормально работает
как правильно передеать объект в ф-ю dll



работая с указателем на объект обязательно надо проверять его валидность - что объект на который указатель указывает действительно существует и доступен.

11
25 октября 2007 года
oxotnik333
2.9K / / 03.08.2007
каким способом проверить можно?
1
25 октября 2007 года
kot_
7.3K / / 20.01.2000
Цитата: oxotnik333
каким способом проверить можно?


 
Код:
if(!TreeView){
 //Здесь выполняешь действия если объект не создан.
ShowMessage("Error!!!!");
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог