как правильно создать DLL в С++ Builder'е
Сначала расскажите, как создать заголовочный файл для DLL'ки, что в этот заголовочный файл надо писать?
Заранее балгодарен...
Пробовал воспользоваться стандартным "мастером" для создания проекта для DLL?
Да, я пробовал создавать DLL стандартным мастером, DLL'а создалась, создался и .LIB-файл, т. е. всё создалось...
В общем, допустим есть DLL'ка, там написано:
///////////////////////////////////////////
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
void func()
{
ShowMessage("It is working");
}
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
///////////////////////////////////////////////
(комментарии я выкинул)
в header'е написано:
///////////////////////////////////////////////
#ifdef _BUILDING_THE_DLL
#define _EXPORT_TYPE _export
#else
#define _EXPORT_TYPE _import
#enif
void _EXPORT_TYPE func();
////////////////////////////////////////////////
(правда я не занаю, что означают все эти препроцессорные диреутивы, прочитал прсто где-то,
что писать надо вот так, ну вот и написал...)
Выполнил команду Project->Build, получились файлы DLL.dll, DLL.lib и ещё некоторые.
В EXE-шнике, использующем эту DLL-ку я написал:
/////////////////////////////////////////////////
#pragma hdrstop
#include "DLL.h"
#pragma argsused
int main(int argc, char* argv[])
{
func();
return 0;
}
/////////////////////////////////////////////////
(заголовочный файл DLL'и у меня называется DLL.h
LIB-файл наз. DLL.lib , сама DLL'ка называется
DLL.dll )
К консольному проекту, использующему DLL'у, я добавил файл DLL.lib (командой Project->Add toproject и т. д.
Пытаюсь собрать этот самый консольный проект, но компилятор выдаёт ошибку
[Linker Error] Unresolved external 'func()' referenced from C:\DOCUMENTS AND SETTINGS\USER\ÐÀÁÎ×ÈÉ ÑÒÎË\PROGRAMME\UNIT1.OBJ
Чё за хрень, прости за выражение?
Прошу тебя, помоги разобраться, PEASE!
Да, я пробовал создавать DLL стандартным мастером, DLL'а создалась, создался и .LIB-файл, т. е. всё создалось...
В общем, допустим есть DLL'ка, там написано:
....................
(комментарии я выкинул)
в header'е написано:
....................
(правда я не занаю, что означают все эти препроцессорные диреутивы, прочитал прсто где-то,
что писать надо вот так, ну вот и написал...)
Выполнил команду Project->Build, получились файлы DLL.dll, DLL.lib и ещё некоторые.
В EXE-шнике, использующем эту DLL-ку я написал:
....................
Если пользовался стандартным мастером, то он уже всё сделал сам, как надо, ничего им созданное исправлять нет необходимости. Посмотри прилагающийся пример, и тебе всё станет понятно.
Если пользовался стандартным мастером, то он уже всё сделал сам, как надо, ничего им созданное исправлять нет необходимости. Посмотри прилагающийся пример, и тебе всё станет понятно.
Если пользовался стандартным мастером, то он уже всё сделал сам, как надо, ничего им созданное исправлять нет необходимости. Посмотри прилагающийся пример, и тебе всё станет понятно.
Огромное спасибо за пример, не знаю даже как вас благодарить, но если у меня всё-таки возникнут проблемы, то я опять к Вам обращусь, ладно?
А пока спасибо за помощь!
В общем, допустим есть DLL'ка, там написано:
...
#ifdef _BUILDING_THE_DLL
#define _EXPORT_TYPE _export
#else
#define _EXPORT_TYPE _import
#enif
void _EXPORT_TYPE func();
...
(правда я не занаю, что означают все эти препроцессорные диреутивы, прочитал прсто где-то,
что писать надо вот так, ну вот и написал
...
Это означает, что если компилишь dll тебе надо добавить #define _BUILDING_THE_DLL(или в Projects->Options->Directories/Conditionals->/Conditionals defines), а когда компилишь ехе ничего делать не надо. Тогда линкер все поставит на "место" в dll func пойдет в секцию export, а в ехе в import...
Это означает, что если компилишь dll тебе надо добавить #define _BUILDING_THE_DLL(или в Projects->Options->Directories/Conditionals->/Conditionals defines), а когда компилишь ехе ничего делать не надо. Тогда линкер все поставит на "место" в dll func пойдет в секцию export, а в ехе в import...
Большое спасибо за помощь, но всё таки почему у меня появляется ошибка такая:
[Linker Error] Unresolved external 'func()' referenced from C:\DOCUMENTS AND SETTINGS\USER\Рабочий стол\PROGRAMME\UNIT1.OBJ
Да, кстати, у меня Builder 6.0...
И ещё один вопросец: когда надо и когда не надо ставить галочку напротив Generate import library в Project->Options->Linker? Что даст мне эта галочка, как всё это хозяйство использовать?
Большое спасибо за помощь, но всё таки почему у меня появляется ошибка такая:
[Linker Error] Unresolved external 'func()' referenced from C:\DOCUMENTS AND SETTINGS\USER\Рабочий стол\PROGRAMME\UNIT1.OBJ
Да, кстати, у меня Builder 6.0...
И ещё один вопросец: когда надо и когда не надо ставить галочку напротив Generate import library в Project->Options->Linker? Что даст мне эта галочка, как всё это хозяйство использовать?
Дорогие товарищи, дамы и господа, леди и джем-пелбмени!
Повторяю свой вопрос, поверьте, для мня это очень важно!
Итак, ответьте пожалуйста,
почему у меня появляется ошибка такая, когда ю пытаюсь собрать проект, использующий DLL-ку:
[Linker Error] Unresolved external 'func()' referenced from C:\DOCUMENTS AND SETTINGS\USER\Рабочий стол\PROGRAMME\UNIT1.OBJ
Да, кстати, у меня Builder 6.0...
И ещё один вопросец: когда надо и когда не надо ставить галочку напротив Generate import library в Project->Options->Linker? Что даст мне эта галочка, как всё это хозяйство использовать?
Дорогие товарищи, дамы и господа, леди и джем-пелбмени!
Повторяю свой вопрос, поверьте, для мня это очень важно!
Итак, ответьте пожалуйста,
почему у меня появляется ошибка такая, когда ю пытаюсь собрать проект, использующий DLL-ку:
[Linker Error] Unresolved external 'func()' referenced from C:\DOCUMENTS AND SETTINGS\USER\Рабочий стол\PROGRAMME\UNIT1.OBJ
Да, кстати, у меня Builder 6.0...
И ещё один вопросец: когда надо и когда не надо ставить галочку напротив Generate import library в Project->Options->Linker? Что даст мне эта галочка, как всё это хозяйство использовать?
Коротко: RTFM.
Развёрнуто: смотри справку. В диалоге имеется кнопка её вызова, там написано нормальным английским языком, для чего эта "галочка" нужна.
Пример, который я положил, компилируется? Линкуется? Работает? Если ответ на все три вопроса положительный - изучай его внутренности. Если отрицательный - ищи, где напортачил. Может, билдер криво установился?
никак не могу создать работоспособную DLL в билдере. Сколько не стараюсь, всё равно не работает!
Сначала расскажите, как создать заголовочный файл для DLL'ки, что в этот заголовочный файл надо писать?
Заранее балгодарен...