社区
Windows SDK/API
帖子详情
如何在动态库中打开窗口
gflpower
2003-10-15 05:07:02
如何在动态库中打开窗口
...全文
50
1
打赏
收藏
如何在动态库中打开窗口
如何在动态库中打开窗口
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
1 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
pankun
2003-10-15
打赏
举报
回复
转自猛料
作为一个经常被提起的问题,很多人不知道怎么来从DLL中导出窗体,特别是MDI的子窗体,因此Kingron愿意在这里把一些经验写出来给大家分享,让大家在碰到类似的问题的时候,少走些弯路。
大家知道,DLL有两种加载方式,至于动态的,和静态的,稍微有点儿区别。动态的加载,大家可以参考Torry's Delphi Page上面的例子,其中有一个MDI的例子,非常简单的,很好用。我的例子以静态加载为主。
据目前来看,我们要在DLL中导出这个Form的话,必须通过DLL导出函数来做到,但是我们知道DLL工程的Application和Host程序的Application是有区别的,对于一般的应用程序来说,Application是VCL固定的,一般不会修改Application对象指针,但是在DLL中,我们需要使用窗体等,或者使用Application对象的时候,使DLL的Application和Host程序一样,这样才不至于混淆。以下面的例子为例,如果不修改Application对象,那么Host程序退出的时候,可能出现AV错误!例如:
在Host中Export一个函数:
function DllFunction(App:TApplication;PForm:TForm):TForm2;stdcall;
begin
Result :=TForm2.Create(PForm);
end;
那么主程序推出的时候,很可能发生AV错误。
下面一步一步来做:
首先,我们需要一个DLL工程,在IDE中New一个DLL,然后New一个Form,Save All File,工程名为DLL.DPR,Form的Unit文件为DLLForm.pas,窗体类名为FrmDLLChild。然后随便设计这个DLLChild Form即可。
然后,在DLL.DPR中修改代码,添加:
library Dll;
uses
SysUtils,windows,
Classes,Controls,Forms,
DllForm in 'DllForm.pas' ;
{$R *.res}
var
DllApp:TApplication;
{ 用于初始化:保存DLL本身的Application,然后设置DLL的Application指向Host的Application }
procedure InitDLL(App:TApplication);stdcall;
begin
DllApp:=Application;
Application:=App;
end;
{ 善后工作:恢复DLL原来的Application }
procedure FreeDLL;stdcall;
begin
Application:=DllApp;
end;
{ 返回一个窗体对象,这是DLL的主要功能 }
function GetDllChildForm(Parent:TComponent):TFrmDLLChild;stdcall;
begin
Result := TFrmDLLChild.Create(Parent);
end;
exports
InitDLL,FreeDLL,GetDllChildForm;
begin
end.
至此DLL已经完成了,在使用DLL的时候,需要注意:首先必须调用InitDLL,并且传递主程序的Application作为参数,否则主程序退出的时候,会报AV错误。
主程序调用如下:
为了简单方便地使用,可以把DLL中包含窗体的那个单元Use进来,如果不喜欢,用类型强制也可。
function GetDllChildForm(Parent:TComponent):TFrmDllChild;stdcall;external 'dll.dll';
procedure InitDLL(App:TApplication);stdcall;external 'dll.dll';
procedure FreeDLL;stdcall;external 'dll.dll';
procedure TForm1.FormCreate(Sender: TObject);
begin
InitDLL(Application);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeDLL;
end;
调用窗体代码:
var
DForm:TFrmDllChild;
begin
DForm :=DllFunction(Application,Self);
DForm.Show;
end;
附件中的代码完整演示了一个简单的例子。 DllProject.rar
至于动态加载的演示,请参看《MDI Child Form和DLL》
Qt捕获Opencv窗体并加载到界面
1、Qt捕获Opencv窗体cv::imshow并加载到界面 2、使用OpenCV、RTSP
打开
摄像头 3、适合初学者,涉及到Hand句柄基础...4、本人使用Qt5.10.0、vs2015、opencv3.4.3,必须在运行根目录添加opencv
动态库
或将此库添加环境变量
动态库
打开
失败怎么办
以后我们是有写日志就直接
打开
动态库
liblog.so就可以使用了,但是运行使用的时候出现了以下错误: //函数指针的使用 typedef int (*WRITE_FILELOG)(PRINT_LEVEL level,char* file_path,char* fmt,...); WRITE_...
Python Tkinter窗体讲解
Python作为自立门户的语言,除了学习它的基础编程...当然大家也不用担心,即使没学过,在学习了该教程提供的Python的Tkinter窗体后,也会让你快速的掌握。这样我们就可以使用Python做一些小游戏,或者做一些小系统。
使用dumpbin工具查看
动态库
中
函数列表
Dumpbin是自带的一个命令行工具,用于查看可执行文件、静态库和
动态库
的...进入
动态库
所在目录:在命令提示符
中
,使用cd命令进入
动态库
所在的目录。使用dumpbin这个命令将会输出
动态库
中
所有导出的函数的名称和地址。
C#实现从dll程序集
中
动态加载窗体
将任何包含窗体的代码编译成 dll 文件,再把 dll 文件拷贝到本程序的目录下,本程序运行时即可动态检查到 dll 文件
中
的窗体,将窗体类的类型在程序菜单
中
显示出来,点击菜单即可运行对应的窗体. 本程序主要用到...
Windows SDK/API
1,183
社区成员
22,335
社区内容
发帖
与我相关
我的任务
Windows SDK/API
Delphi Windows SDK/API
复制链接
扫一扫
分享
社区描述
Delphi Windows SDK/API
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章