![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Shurik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 19.2.2004 Репутация: нет Всего: нет |
Не могу понять правила написания DLL и импорта экспортируемых функций в исполняемые модули. Пишу на Builder 5. Н ашёл примеры-везде описуют по разному.
|
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Shurik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 19.2.2004 Репутация: нет Всего: нет |
Не могу разобраться что за чем написать, чтоб создать DLL. И как её потом подключить при написаниии и компиляции исполняемого файла. Там создаётся файл .lib и его как-то надо подключать при компиляции. Вобщем, мне надо подробности. А то примеров скачал много, а не один не работает.Заранее спасибо.
|
|||
|
||||
| Guest |
|
|||
|
Unregistered |
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 |
|
|||
|
Unregistered |
Простите, не могу подредактировать предыдущее сообщение, поскольку сами мы не местные: нет регистрации
Shurik Проекты между собой никак не связаны. Никаких LIB'ов при компиляции подсовывать не нужно, если делать так, как я написал. Единственное, что нужно для второго (EXE) проекта - это сам DLL в каталоге запуска, путях или Windows\System. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |