|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Сохранение формы в DLL
У меня есть DLL с упакованной модальной формой
Код:
library dprFormDll2; uses SysUtils, Windows, Classes, unFormDll2 in 'unFormDll2.pas' {Form1}; {$R *.res} function ShowForm: Integer; stdcall; begin try Form1 := TForm1.Create(nil); Form1.ShowModal; if (Form1.ModalResult = idOk) then Result := Form1.ListBox1.ItemIndex else Result := -1; finally FreeAndNil(Form1); end; end; exports ShowForm; begin end. Потом из другого проекта я пытаюсь вызвать эту DLL: Код:
unit unRunDll2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm2 = class(TForm) Label1: TLabel; procedure FormDblClick(Sender: TObject); private { Private declarations } public { Public declarations } end; TShowForm2= function : Integer; stdcall; var Form2: TForm2; ShowForm2: TShowForm2; LibHandle: THandle; Res: Integer; implementation {$R *.dfm} procedure TForm2.FormDblClick(Sender: TObject); begin // @ShowForm2 := nil; libHandle := LoadLibrary('E:\Aleksandr_Delphi\Примеры программ\Размещение форм в DLL\dprFormDll2.dll'); @ShowForm2 := GetProcAddress(LibHandle, 'ShowForm'); Res := ShowForm2; case Res of 0: Label1.Caption := 'Первый вариант'; 1: Label1.Caption := 'Второй вариант'; 2: Label1.Caption := 'Третий вариант'; else Label1.Caption := 'Нет варианта'; end; end; end. |
#2
|
||||
|
||||
может так?
Код:
... exports ShowForm name 'ShowForm'; jmp $ ; Happy End! The Cake Is A Lie. |
#3
|
||||
|
||||
Код:
library Project1dll; uses Forms, Unit1dll in 'Unit1dll.pas' {Form1}; function ShowModal(s: ShortString): Integer; begin Form1:=TForm1.Create(nil); Form1.Caption:=s; Result:=Form1.ShowModal; Form1.Free; end; exports ShowModal; begin end. Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; FShowModal: function (s: ShortString): Integer; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var hLibrary: Cardinal; begin hLibrary:=LoadLibrary('Project1dll.dll'); if hLibrary<>0 then begin FShowModal:=GetProcAddress(hLibrary, 'ShowModal'); if @FShowModal<>nil then ShowMessage(IntToStr(FShowModal('ShowMessage'))) else ShowMessage('!ShowModal'); FreeLibrary(hLibrary); end; end; end. Пишу программы за еду. __________________ Последний раз редактировалось NumLock, 31.05.2011 в 09:33. |
#4
|
||||
|
||||
Я попытался дословно сделать проект как у вас. Но при запуске выдается все время ошибка: "Cannot debug project unless a host application is defined. Use Run/Parameters... dialog box". При попытке зайти на Запуск/Параметры... я получаю еще одну ошибку: "Ancestor for 'GroupBox1' not found". хотя как не пытаюсь сравнить оба проекта, различий не нахожу.
|
#5
|
||||
|
||||
вообще ничего не понял про последнее "Ancestor for 'GroupBox1' not found"...
Пишу программы за еду. __________________ |
#6
|
||||
|
||||
Цитата:
|
#7
|
||||
|
||||
ну поступи обычным способом: сперва откомпилируй библиотеку, потом exe и стартуй с exe.
Пишу программы за еду. __________________ |