Главная страница
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.032 c
15-1254238851
Суслик_
2009-09-29 19:40
2009.11.29
Идея борьбы со спамом


15-1254400228
Kerk
2009-10-01 16:30
2009.11.29
Предлагаю наш ОМОН послать учиться в США, демократичнее надо быть


1-1210408735
fender2008
2008-05-10 12:38
2009.11.29
C++ DLL


2-1255597644
night_light
2009-10-15 13:07
2009.11.29
Resource TmyForm not Found


15-1254379545
@!!ex
2009-10-01 10:45
2009.11.29
Помогите с оплатой счета по PayPal