Форум — Ответы     (  К темам )
 ?  Annihilator: как использовать DLL в программе? (10-05-2003 13:37:52) http://metalsoft.nm.ru
Люди, помогите, кто знает: как через программу можно запустить библиотеку DLL, мне нужно некое подобие RunDLL32, только запуск из свего приложения. (все параметры описанные в этом DLL я знаю) У меня есть исходники одной программки, которые компилируются в DLL, как плагин к другой проге, я просто хочу использовать эту DLL в своём приложении. Кто знает — помогите, пожалйста.
 Павел (10-05-2003 18:23:49)
Для использования DLL в своей программе эту DLL надо сначала загрузить в память функцией:

HINSTANCE hL = LoadLibrary("c:\\MyMp3.dll");
if(!hL) {
ShowMessage("Не найдена библиотека MyMp3.dll !");
Application->Terminate();
}

Для использования какой-либо функции из этой dll
используется функция GetProcAddress():

// например, у нас в dll лежат функции mp3play() и mp3stop()
// которые мы хотим у себя использовать, причем
// функция mp3stop() без параметров, а функция mp3play()
// имеет 1 параметр типа указатель на структуру PlayRecord*

typedef struct {
AnsiString FileName;
DWORD SeekAtStart;
HWND Owner;
DWORD Result;
} PlayRecord;

PlayRecord DATA;

// создаем указатели на эти функции
void (_cdecl *mp3play)(PlayRecord* );
void (_cdecl *mp3stop)(void);

// присваиваем им значения
mp3play= (void(_cdecl*)(PlayRecord*))GetProcAddress(hL,"mp3play");
mp3stop= (void(_cdecl*)(void))GetProcAddress(hL,"mp3stop");

// вызываем эти функции из dll далее у себя в программе:

mp3play(&DATA);
mp3stop();

Потом не забудьте ее выгрузить из памяти:(например при закрытии формы)
if(hL) FreeLibrary(hL);

------------------------------------------
Или другой пример: (некая dll для работы со сканером: Chipher.Dll)

Описываем в .h файле:
private: // User declarations
HINSTANCE hInst;

Далее в программе:
// загрузка библиотеки
hInst = LoadLibrary("Chipher.Dll");
if (!hInst) { Label1->Caption = "Невозможно загрузить DLL"; return; }

// получаем адрес нужной нам процедуры из dll и запускаем ее.
// здесь это функция: int Chipher_INIT(int, bool);

// указатель на ф-цию
int ((pascal *Chipher_INIT)(int Port, bool isWait));

// присваиваем значение этому указателю — т.е. получаем адрес нашей функции
Chipher_INIT = (int ((pascal *)(int, bool)))GetProcAddress(hInst, "Chipher_INIT");

// вызываем функцию Chipher_INIT, адрес которой мы получили из dll
// с помощью GetProcAddress
int err = Chipher_INIT(2, true);
if (err) {
Label1->Font->Color = clRed;
Label1->Caption = "Ошибка инициализации сканера";
return;
}

// получаем число записей, готовых к передаче
long ((pascal *Chipher_COUNT)());
Chipher_COUNT = (long ((pascal *)()))GetProcAddress(hInst, "Chipher_COUNT");
long cnt = Chipher_COUNT();
if (cnt <= 0){
Label1->Caption = "Ошибка получения количества записей";
return;
}

// ... и так далее

// выгрузить Dll библиотеку
FreeLibrary(hInst);
 Annihilator (19-05-2003 16:05:10) http://metalsoft.nm.ru
БОЛЬШОЕ СПАСИБО!!!