真心求教,如何动态的调用dll中的窗体类 我要在执行程序中动态的调用dll中的窗体类。窗体类类名从执行程序传入,然后把dll中对应的窗体show出来。谢谢。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://www.chinaaspx.com/archive/delphi/3382.htm 看了你给的代码,貌似没有解决我的问题dll中的窗体创建的时候,类名没有从外部传入啊。如果dll中封装了多个窗体,外部程序怎么才能动态的指定要创建哪个呢? 一般来讲DLL中不应该出现窗体的吧,如果需要出现窗体最好写dpk包吧!按照你的要求窗体的创建和showmodal都是应该在DLL完成的其中还包括了窗体的释放将这些操作封装为函数然后在外部的程序中直接调用该函数来操作就可以了 angle你说的方法我也试过,如果在dll方法中直接指定要show哪个窗体是没问题的。但是如果这个方法加上参数(类名),然后由外部程序调用时传入参数,在ShowModal的时候就会报内存错误。这是是dll中的输出方法:procedure showform(frm:string);stdcall;var TheForm:TForm;begin try TheForm:=TForm(getclass(frm)).Create(nil); TheForm.ShowModal; finally FreeAndNil(TheForm); end;end;传入的类所对应的窗体我已经注册过了:initialization RegisterClass(TFrmDLL002);finalization UnregisterClass(TFrmDLL002);这是执行程序的调用代码:procedure TForm1.Button2Click(Sender: TObject);var rp: ShowDll002;begin iHandle := SafeLoadLibrary(PChar('DLL002\Prjdll002.dll')); if iHandle = 0 then begin showmessage('DLL002无法加载!'); Exit; end; try try @rp := GetProcAddress(iHandle, 'showform'); if Assigned(@rp) then begin rp('TFrmDLL002'); end else begin showmessage('加载了非法程序!'); end; except raise; end; finally FreeLibrary(iHandle); end;end;是否这种方案行不通?不行的话我就只能转用bpl调用了,谢谢。 散、散、散、散!散了吧! 用tcpclient连接服务端时,想先检查一下服务端ip地址和端口的连通性,用什么函数可以快速检查? 如何解决数据更新时的假死现象 ?如何给文本框上底色 DELPHI为什么会自动退出? 大讨论:各位前辈,你们在网上赚过钱吗?赚的多吗?请你们说说你们的经验,让我们刚出道的小弟学学! 一个关于dll的例子,运行不了,请帮忙看一下。 我想得到天数 请问如果让程序的字体在win7下不自动渲染?????????? 呵呵,有意思。。。 在用comboBox做查询时出现的问题,请各位看看! 如何将十进制数变为十六进制数,并将它存入一个BYTE类型的变量中
dll中的窗体创建的时候,类名没有从外部传入啊。
如果dll中封装了多个窗体,外部程序怎么才能动态的指定要创建哪个呢?
按照你的要求窗体的创建和showmodal都是应该在DLL完成的其中还包括了窗体的释放
将这些操作封装为函数然后在外部的程序中直接调用该函数来操作就可以了
但是如果这个方法加上参数(类名),然后由外部程序调用时传入参数,在ShowModal的时候就会报内存错误。这是是dll中的输出方法:
procedure showform(frm:string);stdcall;
var
TheForm:TForm;
begin
try
TheForm:=TForm(getclass(frm)).Create(nil);
TheForm.ShowModal;
finally
FreeAndNil(TheForm);
end;
end;传入的类所对应的窗体我已经注册过了:
initialization
RegisterClass(TFrmDLL002);
finalization
UnregisterClass(TFrmDLL002);
这是执行程序的调用代码:
procedure TForm1.Button2Click(Sender: TObject);
var
rp: ShowDll002;
begin
iHandle := SafeLoadLibrary(PChar('DLL002\Prjdll002.dll'));
if iHandle = 0 then begin
showmessage('DLL002无法加载!');
Exit;
end; try
try
@rp := GetProcAddress(iHandle, 'showform');
if Assigned(@rp) then begin
rp('TFrmDLL002');
end else begin
showmessage('加载了非法程序!');
end;
except
raise;
end;
finally
FreeLibrary(iHandle);
end;
end;是否这种方案行不通?不行的话我就只能转用bpl调用了,谢谢。