Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Простите, не могу подредактировать предыдущее сообщение, поскольку сами мы не местные: нет регистрации biggrin.gif .
Shurik
Проекты между собой никак не связаны. Никаких LIB'ов при компиляции подсовывать не нужно, если делать так, как я написал. Единственное, что нужно для второго (EXE) проекта - это сам DLL в каталоге запуска, путях или Windows\System.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)