Текущий архив: 2009.11.29;
Скачать: CL | DM;
Вниз
Вызов Tform из dll Найти похожие ветки
← →
LOS_A (2005-08-16 10:19) [0]Я заранее прошу прощение за вопрос, потому что чтото подобное уже обсуждалось, но меня этот вопрос интерисует критически.
Есть 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;
Но активатор выводит ошибку(чтото с парамерами конструктора помоему)
← →
Игорь Шевченко © (2005-08-16 11:23) [1]
> Но активатор выводит ошибку
Судя по отсутствию ее текста - секретную.
← →
LOS_A (2005-08-16 11:34) [2]Прошу прощение на самом деле команда такая
obj := Activator.CreateInstance(t);
а ошибка "NO parameterless constructor defined for this object.
← →
Игорь Шевченко © (2005-08-16 11:36) [3]
> а ошибка "NO parameterless constructor defined for this
> object.
Ну да, конструктор формы имеет параметр Owner - все верно. Я бы сделал метод без параметров, создающий форму и вызывал бы его.
← →
LOS_A (2005-08-16 11:41) [4]А пример можно? Пожалуйсто!
← →
DiamondShark © (2005-08-16 12:33) [5]Конструктор с параметрами (хм... это VCL-ный изврат? System.Windows.Forms.Form без параметров).
Activator имеет перегруженную версию CreateInctance для вызова конструктора с параметрами.
MSDN -- рулез.
← →
LOS_A (2005-08-16 13:06) [6]А какой Параметр передать надо? Я еще пробывал так:
obj := t.InvokeMember(".ctor",BindingFlags.CreateInstance,nil,nil,[???]);
← →
DiamondShark © (2005-08-16 14:28) [7]
> А какой Параметр передать надо?
Такой, какой требуется конструктору класса. Посмотреть, какие параметры принимает конструктор можно в описании класса.
← →
LOS_A (2005-08-16 15:01) [8]Все разобрался
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;
Большое всем спосибо!
← →
LOS_A (2005-08-16 16:31) [9]Разобрались с одним появилось другое. Вызываю 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;
← →
DiamondShark © (2005-08-16 17:30) [10]Значит какой-то лишний флаг.
Страницы: 1 вся ветка
Текущий архив: 2009.11.29;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.006 c