Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вызов Tform из dll [D8, D2005, WinXP]


LOS_A ©   (2005-08-16 10:19:00) 

Я заранее прошу прощение за вопрос, потому что чтото подобное уже обсуждалось, но меня этот вопрос интерисует критически.
Есть 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;


Но активатор выводит ошибку(чтото с парамерами конструктора помоему)


DiamondShark   (2005-08-16 17:30:00) [1]

Значит какой-то лишний флаг.


LOS_A   (2005-08-16 16:31:00) [2]

Разобрались с одним появилось другое. Вызываю 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;


LOS_A   (2005-08-16 15:01:00) [3]

Все разобрался
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;


Большое всем спосибо!


DiamondShark   (2005-08-16 14:28:00) [4]


> А какой Параметр передать надо?

Такой, какой требуется конструктору класса. Посмотреть, какие параметры принимает конструктор можно в описании класса.


LOS_A   (2005-08-16 13:06:00) [5]

А какой Параметр передать надо? Я еще пробывал так:
obj := t.InvokeMember('.ctor',BindingFlags.CreateInstance,nil,nil,[???]);


DiamondShark   (2005-08-16 12:33:00) [6]

Конструктор с параметрами (хм... это VCL-ный изврат? System.Windows.Forms.Form без параметров).
Activator имеет перегруженную версию CreateInctance для вызова конструктора с параметрами.
MSDN -- рулез.


LOS_A   (2005-08-16 11:41:00) [7]

А пример можно? Пожалуйсто!


Игорь Шевченко   (2005-08-16 11:36:00) [8]


> а ошибка "NO parameterless constructor defined for this
> object.


Ну да, конструктор формы имеет параметр Owner - все верно. Я бы сделал метод без параметров, создающий форму и вызывал бы его.


LOS_A   (2005-08-16 11:34:00) [9]

Прошу прощение на самом деле команда такая
obj := Activator.CreateInstance(t);
а ошибка "NO parameterless constructor defined for this object.


Игорь Шевченко   (2005-08-16 11:23:00) [10]


> Но активатор выводит ошибку


Судя по отсутствию ее текста - секретную.


Наверх

Титульная страница Поиск, карта сайта Написать письмо