Эх… опять все сказали что да как, но никто ничего не объяснил
Как скажет один из моих преподавателей: «Смотри Сюда!»
МатЧасть.:Когда Вы программируете на Lazarus и пишете GUI , то Lazarus играет роль IDE во всех смыслах этого слова. (Но нужно понимать, что вы используете (ну не вы а IDE вообще-то) компилятор FPC).
Когда же Вы при помощи Lazarus, пишете DLL, то на самом деле он как бы перестал играть роль IDE, а стал ну как бы навороченным блокнотом, который скормит ваш исходник FPC и все. Вот в этом и все, кроится ваша проблема.
А именно, FPC не имеет никакого понятия о модуле Dialogs. Потому что это часть LCL(библиотека(набор модулей и классов) Lazarus-а), а компилятор знаете только о своем наборе модулей и классов а именно об FCL (библиотека(набор модулей и классов) языка Free Pascal).
По этому чтобы все работало, в проекте нужно дописать(прописать) дополнительные пути до той самой LCL, чтобы FPC как компилятор смог понять что блин вот откуда мне брать модуль Dialogs.
Долго писать что да как, привожу скриншот:
Подключаем пакет LCL. А лучше вообще забыть про данные функции и про GUI часть LCL.
По идее это правильно, но иногда нужно скрыть реализацию именно GUI и ниже с ней логики в DLL и выдавать лишь интерфейсный модуль, мол пользуйтесь, но я вам не скажу как я это сделал.
В чем тут сложность и всякие не хорошие вещи. Нужно как я писал выше прописать пути до LCL, и делать нечто подобное:
- Код: Выделить всё
library mylib;
{$mode objfpc}{$H+}
uses
Classes,Forms, Interfaces, Unit1
{ you can add units after this };
{$R *.res}
procedure Show1; stdcall; export;
var NForm:TForm1;
begin
Application.Initialize;
NForm:=TForm1.Create(Application);
try
NForm.ShowModal;
finally
NForm.Free;
end;
end;
Exports Show1 index 1;
begin
end.
Обратите внимание на строчку:- Код: Выделить всё
Application.Initialize;
После этого можно юзать форму спрятанную в DLL в вашем приложении.
Теперь, что касается именно вашей проблемы, онa решается аналогичным способом:
- Код: Выделить всё
library mylib;
{$mode objfpc}{$H+}
uses
Classes,Forms, Interfaces, Dialogs
{ you can add units after this };
{$R *.res}
procedure Show1; stdcall; export;
begin
Application.Initialize;
ShowMessage('S');
//MessageDlg('S','',mtError,[mbNo],'ad'); //можно и Тае еще :)
end;
Exports Show1 index 1;
begin
end.
Долго писать, если интересно смотрите прилагаемые исходники…
Что касается ГУИ в ДЛЛ вообще да лучше так не делать… да и не зачем… а вот что касается логики, процедур, функций то да… на то ДЛЛ и созданы.
Но и даже в этом случае, нужно помнить о том, что нужно возвращать простые типы и т.п., но это уже другая тема.
У вас нет необходимых прав для просмотра вложений в этом сообщении.