Re[5]: Помогите разобраться с Dll в Builder
От: sercher Украина  
Дата: 09.06.03 12:58
Оценка: 24 (2)
Вообще на будущее, если не закрывать глобальные переменные локальными, а потом пытаться использовать глобальные, то всё будет ОК!
Re: Помогите разобраться с Dll в Builder
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 09.06.03 10:47
Оценка: 5 (2)
Здравствуйте, LeoMonster, Вы писали:

LM>Здравствуйте!


LM>Есть Dll, на чем написана не известно. Надо подключить в начале работы и выгрузить в конце. Делаю так:


[]

Попробуйте так:

1. в *.h-файле:


typedef void (__stdcall *DLLFunction) (int);

class TForm1 : public TForm
{
...

private:

 HANDLE hDll;
 DLLFunction Feed;
 DLLFunction ConnectKKM;

};


в *.cpp-файле:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
 hDll = ::LoadLibrary("chon100.dll");

   if(hDll)
    {
     Feed = (DLLFunction) ::GetProcAddress(hDll,"Feed");
     ConnectKKM = (DLLFunction) ::GetProcAddress(hDll,"ConnectKKM");
    }

}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
Feed  = NULL;
ConnectKKM = NULL;

  if(hDll)
   ::FreeLibrary(hDll);
hDll = NULL;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{

 if(ConnectKKM)
    ConnectKKM(1);

 if(Feed)
    Feed(1);
  
}
Помогите разобраться с Dll в Builder
От: LeoMonster Россия http://ix-group.ru
Дата: 09.06.03 10:37
Оценка:
Здравствуйте!

Есть Dll, на чем написана не известно. Надо подключить в начале работы и выгрузить в конце. Делаю так:

void TForm1::InitKKM()
{
 hKKM = LoadLibrary("chon100.dll");
 void (*pFeed)(int);
 (FARPROC &)pFeed = GetProcAddress(hKKM, "Feed");
 void (*pConnectKKM)(int);
 (FARPROC &)pConnectKKM = GetProcAddress(hKKM, "ConnectKKM");
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 InitKKM(); 
}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
 FreeLibrary(hKKM);
}


Но при вызове функций

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 pConnectKKM(1);
 pFeed(1);
}


происходит ошибка «Access violation at address 000000. Read of address 000000»
Функции и переменная описаны так:


HANDLE hKKM; 
void (*pFeed)(int);
void (*pConnectKKM)(int);


Что делать?

P.S.: Если делаю так, то все работает... но так нельзя...

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 HANDLE hKKM; 
 void (*pFeed)(int);
 void (*pConnectKKM)(int);
 hKKM = LoadLibrary("chon100.dll");
 void (*pFeed)(int);
 (FARPROC &)pFeed = GetProcAddress(hKKM, "Feed");
 void (*pConnectKKM)(int);
 (FARPROC &)pConnectKKM = GetProcAddress(hKKM, "ConnectKKM");
 pConnectKKM(1);
 pFeed(1);
 FreeLibrary(hKKM);
}



Заранее большое спасибо!!!
Программист — это не профессия... это диагноз.
Re[2]: Помогите разобраться с Dll в Builder
От: LeoMonster Россия http://ix-group.ru
Дата: 09.06.03 12:14
Оценка:
Здравствуйте, Flamer

Спасибо, так работает , но что делать если у меня много функций в которых не один параметр и они возвращают данные?
Программист — это не профессия... это диагноз.
Re[3]: Помогите разобраться с Dll в Builder
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 09.06.03 12:22
Оценка:
Здравствуйте, LeoMonster, Вы писали:

LM>Здравствуйте, Flamer


LM>Спасибо, так работает , но что делать если у меня много функций в которых не один параметр и они возвращают данные?


Ну так для каждой функции объявляйте указатель на нее, например:


// прототип функции, возвращающей int и принимающей два параметра
typedef int (__stdcall *SomeFunctionPtr)(char* param1, bool param2);

SomeFunctionPtr myFunction;
Re[4]: Помогите разобраться с Dll в Builder
От: LeoMonster Россия http://ix-group.ru
Дата: 09.06.03 12:45
Оценка:
Здравствуйте, Flamer

Спасибо, я так и думал....
Программист — это не профессия... это диагноз.
Re[6]: Помогите разобраться с Dll в Builder
От: LeoMonster Россия http://ix-group.ru
Дата: 09.06.03 13:03
Оценка:
Здравствуйте, sercher, Вы писали:



S> Вообще на будущее, если не закрывать глобальные переменные локальными, а потом пытаться использовать глобальные, то всё будет ОК!


А где я перекрыл глобальные?
Программист — это не профессия... это диагноз.
Re[7]: Помогите разобраться с Dll в Builder
От: sercher Украина  
Дата: 09.06.03 13:16
Оценка:
void TForm1::InitKKM()
{
 hKKM = LoadLibrary("chon100.dll");
 void (*pFeed)(int);       
 (FARPROC &)pFeed = GetProcAddress(hKKM, "Feed");
void (*pConnectKKM)(int);
 (FARPROC &)pConnectKKM = GetProcAddress(hKKM, "ConnectKKM");
}


pFeed и pConnectKKM — локальные переменные, уничтожаются при выходе из InitKKM
Re[8]: Помогите разобраться с Dll в Builder
От: LeoMonster Россия http://ix-group.ru
Дата: 09.06.03 13:32
Оценка:
Здравствуйте, sercher

Точно!!! Вот в чем проблема была....
А что делать если я переменную хочу прочитать?
Программист — это не профессия... это диагноз.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.