![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
У меня есть 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'; |
|
#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.
|