![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вызов Tform из dll [D8, D2005, WinXP]
LOS_A © (2005-08-16 10:19:00)Я заранее прошу прощение за вопрос, потому что чтото подобное уже обсуждалось, но меня этот вопрос интерисует критически.
Есть DLL c добавленной формой, как из другого приложения ее запустить.(прочитал что нужно использовать Reflection)
Пытаюсь так:
procedure InvokeType(aNameSpace: String);
var
obj: System.Object;
t: System.Type;
Met : MethodInfo;
begin
t := Ass.GetType(aNameSpace+'.TForm1');
//Met := t.GetMethod('Form1.ShowModal');
obj := Activator.CreateInstanceFrom());
//Met.Invoke(obj,nil);
t.InvokeMember('Form1.ShowModal', BFlag or BindingFlags.InvokeMethod, nil, obj, nil);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
BFlag := BindingFlags.DeclaredOnly or BindingFlags.Public or
BindingFlags.Instance or BindingFlags.InvokeMethod or BindingFlags.NonPublic;
Ass := Assembly.LoadFrom('C:\Delphi\1\Library1.dll');
InvokeType('Unit1');
end;
Но активатор выводит ошибку(чтото с парамерами конструктора помоему)
DiamondShark (2005-08-16 17:30:00) [1]Значит какой-то лишний флаг.
LOS_A (2005-08-16 16:31:00) [2]Разобрались с одним появилось другое. Вызываю InvokeMember, чтобы установить поле.
t.InvokeMember ('SEND',BFlag or BindingFlags.SetField, nil, f ,['XXX']);
вылазит ошибка "Cannot specify Set on a Field and Invoke on a methed. Parametr name: InvokeAttr.
В EXE определенно так
Public
SEND : string;
LOS_A (2005-08-16 15:01:00) [3]Все разобрался
procedure InvokeType(aNameSpace: String);
var
f : TForm;
obj : System.Object;
t: System.Type;
begin
t := Ass.GetType(aNameSpace+'.TForm1');
f := TForm (t.InvokeMember('.ctor',BindingFlags.CreateInstance,nil,nil,[Application]));
f.Show;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
BFlag := BindingFlags.DeclaredOnly or BindingFlags.Public or
BindingFlags.Instance or BindingFlags.InvokeMethod or BindingFlags.NonPublic;
Ass := Assembly.LoadFrom('C:\Delphi\1\Library1.dll');
InvokeType('Unit1');
end;
Большое всем спосибо!
DiamondShark (2005-08-16 14:28:00) [4]
> А какой Параметр передать надо?
Такой, какой требуется конструктору класса. Посмотреть, какие параметры принимает конструктор можно в описании класса.
LOS_A (2005-08-16 13:06:00) [5]А какой Параметр передать надо? Я еще пробывал так:
obj := t.InvokeMember('.ctor',BindingFlags.CreateInstance,nil,nil,[???]);
DiamondShark (2005-08-16 12:33:00) [6]Конструктор с параметрами (хм... это VCL-ный изврат? System.Windows.Forms.Form без параметров).
Activator имеет перегруженную версию CreateInctance для вызова конструктора с параметрами.
MSDN -- рулез.
LOS_A (2005-08-16 11:41:00) [7]А пример можно? Пожалуйсто!
Игорь Шевченко (2005-08-16 11:36:00) [8]
> а ошибка "NO parameterless constructor defined for this
> object.
Ну да, конструктор формы имеет параметр Owner - все верно. Я бы сделал метод без параметров, создающий форму и вызывал бы его.
LOS_A (2005-08-16 11:34:00) [9]Прошу прощение на самом деле команда такая
obj := Activator.CreateInstance(t);
а ошибка "NO parameterless constructor defined for this object.
Игорь Шевченко (2005-08-16 11:23:00) [10]
> Но активатор выводит ошибку
Судя по отсутствию ее текста - секретную.