Главная страница
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.03 c
2-1255420651
И. Павел
2009-10-13 11:57
2009.11.29
Нужна ли проверка InTransaction в однопоточном приложении?


15-1254397935
картман
2009-10-01 15:52
2009.11.29
окно CPU


15-1254227405
istok20
2009-09-29 16:30
2009.11.29
WiMax...


1-1226303661
dmitry_12_08_73
2008-11-10 10:54
2009.11.29
Определение места появления и размеров окна TColorDialog


1-1227282908
SpellCaster
2008-11-21 18:55
2009.11.29
Инициализация DLL