| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Создание DLL и импортирующего модуля |
| Автор: Shurik 9.4.2004, 00:46 |
| Не могу понять правила написания DLL и импорта экспортируемых функций в исполняемые модули. Пишу на Builder 5. Н ашёл примеры-везде описуют по разному. |
| Автор: Vyacheslav 9.4.2004, 09:07 |
| А по конкретней что не понятно? И вот до кучи http://bcdev.narod.ru/Articles/dll_template.htm |
| Автор: Shurik 10.4.2004, 00:13 |
| Не могу разобраться что за чем написать, чтоб создать DLL. И как её потом подключить при написаниии и компиляции исполняемого файла. Там создаётся файл .lib и его как-то надо подключать при компиляции. Вобщем, мне надо подробности. А то примеров скачал много, а не один не работает.Заранее спасибо. |
| Автор: Guest 13.4.2004, 09:13 |
| Shurik Я тоже не очень в этих DLL на Си, так что не судите строго. Я копал-копал и дошел вот до чего. 1. Проект библиотеки. Его необходимо сразу создать как Dynamic Link Library, иначе потом будет гемор с подправлением файлов проекта. Допустим, есть у нас там файл Test.cpp. а) Нужно сделать функцию - точку входа: // Точка входа в Dll BOOL APIENTRY DllMain(HANDLE hInst,DWORD reason,LPVOID lpReserved) { switch (reason) { case DLL_PROCESS_ATTACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: break; } return TRUE; } Тут у меня ничего не обрабатывается, но функция, AFAIK, нужна для корректной работы LoadLibrary() б) Нужно сделать нашу экспортируемую функцию. #define DllFun __declspec(dllexport) // Это для удобства extern "C" DllFun void TestFun(void); // Интерфейс функции // Собственно функция DllFun void TestFun(void) { ::MessageBox(0,"Test","",MB_OK); // Ну типа Hello, World! }; 2. Проект, загружающий DLL. Это обычный EXE. Здесь на мнужно извратнуться с указателем на функцию из DLL. Ведь мы можем определить ее адрес. void (APIENTRY *DllFun) (void); // Прототип функции (указатель) HINSTANCE hLib=::LoadLibrary("Test.dll"); // Загрузить библиотеку DllFun=(void (APIENTRY*)(void))::GetProcAddress(hLib,"TestFun"); // Адрес функции DllFun(); // Запуск функции ::FreeLibrary(hLib); // Выгрузить библиотеку |
| Автор: Antech 13.4.2004, 09:20 |
| Простите, не могу подредактировать предыдущее сообщение, поскольку сами мы не местные: нет регистрации Shurik Проекты между собой никак не связаны. Никаких LIB'ов при компиляции подсовывать не нужно, если делать так, как я написал. Единственное, что нужно для второго (EXE) проекта - это сам DLL в каталоге запуска, путях или Windows\System. |