Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.017 c
2-1255588723
Маркабес
2009-10-15 10:38
2009.11.29
Как составить SQL запрос в жоские условия ?


8-1173516347
hypnotize
2007-03-10 11:45
2009.11.29
Вывести графику на Canvas с Anti-Aliasing ом


2-1255507653
123123
2009-10-14 12:07
2009.11.29
отключить сочетание клавиш


15-1254455614
RDen
2009-10-02 07:53
2009.11.29
Закрываете обсуждение, дак хоть причину в двух словах указывайте


2-1255407175
TRSteep
2009-10-13 08:12
2009.11.29
большие числа