-
Я заранее прошу прощение за вопрос, потому что чтото подобное уже обсуждалось, но меня этот вопрос интерисует критически. Есть DLL c добавленной формой, как из другого приложения ее запустить.(прочитал что нужно использовать Reflection) Пытаюсь так: procedure InvokeType(aNameSpace: String);
var
obj: System.Object;
t: System.Type;
Met : MethodInfo;
begin
t := Ass.GetType(aNameSpace+'.TForm1');
obj := Activator.CreateInstanceFrom());
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; Но активатор выводит ошибку(чтото с парамерами конструктора помоему)
-
> Но активатор выводит ошибку
Судя по отсутствию ее текста - секретную.
-
Прошу прощение на самом деле команда такая obj := Activator.CreateInstance(t); а ошибка "NO parameterless constructor defined for this object.
-
> а ошибка "NO parameterless constructor defined for this > object.
Ну да, конструктор формы имеет параметр Owner - все верно. Я бы сделал метод без параметров, создающий форму и вызывал бы его.
-
А пример можно? Пожалуйсто!
-
Конструктор с параметрами (хм... это VCL-ный изврат? System.Windows.Forms.Form без параметров). Activator имеет перегруженную версию CreateInctance для вызова конструктора с параметрами. MSDN -- рулез.
-
А какой Параметр передать надо? Я еще пробывал так: obj := t.InvokeMember('.ctor',BindingFlags.CreateInstance,nil,nil,[???]);
-
> А какой Параметр передать надо?
Такой, какой требуется конструктору класса. Посмотреть, какие параметры принимает конструктор можно в описании класса.
-
Все разобрался 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; Большое всем спосибо!
-
Разобрались с одним появилось другое. Вызываю 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;
-
Значит какой-то лишний флаг.
|