Конференция ".Net" » Вызов Tform из dll [D8, D2005, WinXP]
 
  • LOS_A (16.08.05 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;



    Но активатор выводит ошибку(чтото с парамерами конструктора помоему)
  • Игорь Шевченко © (16.08.05 11:23) [1]

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


    Судя по отсутствию ее текста - секретную.
  • LOS_A (16.08.05 11:34) [2]
    Прошу прощение на самом деле команда такая
    obj := Activator.CreateInstance(t);


    а ошибка "NO parameterless constructor defined for this object.
  • Игорь Шевченко © (16.08.05 11:36) [3]

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


    Ну да, конструктор формы имеет параметр Owner - все верно. Я бы сделал метод без параметров, создающий форму и вызывал бы его.
  • LOS_A (16.08.05 11:41) [4]
    А пример можно? Пожалуйсто!
  • DiamondShark © (16.08.05 12:33) [5]
    Конструктор с параметрами (хм... это VCL-ный изврат? System.Windows.Forms.Form без параметров).
    Activator имеет перегруженную версию CreateInctance для вызова конструктора с параметрами.
    MSDN -- рулез.
  • LOS_A (16.08.05 13:06) [6]
    А какой Параметр передать надо? Я еще пробывал так:
    obj := t.InvokeMember('.ctor',BindingFlags.CreateInstance,nil,nil,[???]);

  • DiamondShark © (16.08.05 14:28) [7]

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

    Такой, какой требуется конструктору класса. Посмотреть, какие параметры принимает конструктор можно в описании класса.
  • LOS_A (16.08.05 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 (16.08.05 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 © (16.08.05 17:30) [10]
    Значит какой-то лишний флаг.
 
Конференция ".Net" » Вызов Tform из dll [D8, D2005, WinXP]
Есть новые Нет новых   [134430   +43][b:0][p:0.002]