Форум — Ответы ( К темам )
? | 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 | |
БОЛЬШОЕ СПАСИБО!!!
|