Re[5]: Помогите разобраться с Dll в Builder
Вообще на будущее, если не закрывать глобальные переменные локальными, а потом пытаться использовать глобальные, то всё будет ОК!
Re: Помогите разобраться с Dll в Builder
Здравствуйте, 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
Здравствуйте!
Есть 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
Здравствуйте, Flamer
Спасибо, так работает
, но что делать если у меня много функций в которых не один параметр и они возвращают данные?
Программист — это не профессия... это диагноз.
Re[3]: Помогите разобраться с Dll в Builder
Здравствуйте, LeoMonster, Вы писали:
LM>Здравствуйте, Flamer
LM>Спасибо, так работает , но что делать если у меня много функций в которых не один параметр и они возвращают данные?
Ну так для каждой функции объявляйте указатель на нее, например:
// прототип функции, возвращающей int и принимающей два параметра
typedef int (__stdcall *SomeFunctionPtr)(char * param1, bool param2);
SomeFunctionPtr myFunction;
Re[4]: Помогите разобраться с Dll в Builder
Здравствуйте, Flamer
Спасибо, я так и думал....
Программист — это не профессия... это диагноз.
Re[6]: Помогите разобраться с Dll в Builder
Здравствуйте, 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
Здравствуйте, sercher
Точно!!! Вот в чем проблема была....
А что делать если я переменную хочу прочитать?
Программист — это не профессия... это диагноз.
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить