Вызов Tform из dll
Вызов Tform из dll
Вызов Tform из dll Есть 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; Но активатор выводит ошибку(чтото с парамерами конструктора помоему) -------------------------------------------------------------------------------- Игорь Шевченко c (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. -------------------------------------------------------------------------------- Игорь Шевченко c (16.08.05 11:36) [3] > а ошибка "no parameterless constructor defined for this > object. Ну да, конструктор формы имеет параметр owner - все верно. Я бы сделал метод без параметров, создающий форму и вызывал бы его. -------------------------------------------------------------------------------- los_a (16.08.05 11:41) [4] А пример можно? Пожалуйсто! -------------------------------------------------------------------------------- diamondshark c (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 c (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 c (16.08.05 17:30) [10] Значит какой-то лишний флаг.