delphi 跨版本DLL调用嵌入窗体实现
delphi 能实现把别的DLL的窗体句柄查到后,贴到PANL之中,此类文章网上不少,而如果是delphi不同版本开发的DLL互调时,一些控件内部的定义有所区别,因为无法(至少目前我觉得理论上不可行)实现不同版本的DLL融合一体式的共用同一个appcation.
因此,跨版本的DLL调用,实际上也就是把DLL当做一个独立程序,而数据连接这些需要在DLL中自己再实现一套,会有一定的麻烦,但是如果不得不这样做,这样的牺牲也是没办法的事(如果谁实现了协调的跨版本数据连接共享,希望留言指点一二)
Function GETInterfacedFunc(iApplication:TApplication;iScreen: TScreen;Imode:integer;Userinfo:String):IInterfacedFunc ;stdcall;
上面的代码,是常规的DELPHI 的DLL调用实现,也就是传入
iApplication:TApplication;iScreen: TScreen; 然后返回调用接口。
Function GETInterfacedFunc(Imode:integer;Userinfo:String):IInterfacedFunc ;stdcall;
跨版本相当于独立的程序调用,因此入口函数,就不能再处理 Application与 Screen了,咋们,就当这个DLL是一个独立EXE
如果传了 Application与 Screen ,就是建一个简单的FORM都会报地址错,因为相同的类在不同版本里面,其定义差异很大了。
加载DLL后
下面就是显示窗体了
直接上代码吧
function Tform.Showform(Parent: THandle;PHeight:integer;PWidth:integer ): boolean;
begin
frm:=TfrmMain.Create(nil); //
DM:=TDM.Create(application); //application
if WINAPI.Windows.SetParent(frm.Handle,Parent)=0 then
begin
Result:=False;
frm.Free;
Exit;
end;
SetWindowLong(frm.Handle,GWL_STYLE,GetWindowLong(frm.Handle,GWL_STYLE) and not (WS_CAPTION or WS_THICKFRAME));
// //WS_CAPTION和WS_THICKFRAME分别表示标题栏和边框
WINAPI.Windows.MoveWindow(frm.Handle,0,0,PWidth,PHeight,True);
frm.Show;
end;
使用winAPI 来实现窗体的处理,比直接用delphi 常规代码,更具有兼容性。
外部EXE中的调用代码,我想不需要特别列出,其实与同版本调用,已经是完样一样的了。
就是普通的接口调用了
IInterfacedFunc=interface
['{1440EC99-A782-4E12-9F82-3020C8D887B4}']
Function Showform(Parent: THandle;PHeight:integer;PWidth:integer):boolean;stdcall;
procedure Resize(PHeight:integer;PWidth:integer);stdcall;
procedure CloseForm ;stdcall;
procedure SetCloseProc(Proc:TCloseProc);stdcall;
end;
附:接口pas代码。
delphi 跨版本DLL调用嵌入窗体实现的更多相关文章
- Delphi程序调用C#.Net编译的DLL并打开窗体(详解)
Delphi程序调用C#.Net编译的DLL并打开窗体(详解)最近用C#.Net写了一个公用模块, 本以为仅提供给.Net程序使用, 但是领导要求把这些功能提供给旧系统使用, 天啦, 几套旧系统全是D ...
- Delphi XE3写DLL,用Delphi7调用,报错!
http://bbs.csdn.net/topics/390870532 用delphi xe3写的DLL,delphi7调用,参数都是PAnsiChar,DLL里的函数接收delphi7传的入参,没 ...
- delphi dll调用问题
dll传递string实现方法 delphi中dll传递string的实现方法: dll项目uses第一个引用sharemem单元; 调用的项目uses第一个引用sharemem单元; 调用的单元us ...
- 调用Dll里面的窗体
将窗体资源分装到DLL中并且调用 用Delphi生成DLL并封装窗体的示例 调用Dll里面的窗体 DLL文件 library Project2;{ Important note about DLL m ...
- Delphi采用接口实现DLL调用
Delphi使用模块化开发,可以采用DLL或者BPL,两者的区别是BPL只能被同版本的Delphi使用,DLL可以被不同版本和不同开发工具的开发的软件调用. 因此我们的软件大多使用Delphi作为界面 ...
- Delphi 使用之dll文件生成与调用
DLL是Dynamic-Link Libraries(动态链接库)的缩写,库里面是一些可执行的模块以及资源(如位图.图标等).可以认为DLL和EXE基本上是一回事,只是DLL不能直接执行,而必须由应用 ...
- Delphi 中的DLL 封装和调用对象技术(刘艺,有截图)
Delphi 中的DLL 封装和调用对象技术本文刊登2003 年10 月份出版的Dr.Dobb's 软件研发第3 期刘 艺摘 要DLL 是一种应用最为广泛的动态链接技术但是由于在DLL 中封装和调用对 ...
- delphi不同版本字符串类型的演化(要支持基于firemonkey的app调用,字符串最好使用olevariant类型)
string,DELPHI2009以前的版本string=ansistring,一个字符占一个字节,DELPHI2009及以上版本string=unicodestring,一个字符占二个字节. cha ...
- c#中如何跨线程调用windows窗体控件
c#中如何跨线程调用windows窗体控件? 我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍.首 ...
随机推荐
- html获取摄像头和相册
<input type="file" accept="video/*";capture="camcorder"> <inp ...
- redis删除主从节点
1.删除一个Slave节点 ./redis-cli --cluster del-node 127.0.0.1:7001 74957282ffa94c828925c4f7026baac04a67e291 ...
- Librepilot-创建UAVObject及编译到飞机端和地面站端的步骤
1. 创建UAVObject描述文件(xx.xml),并存放到\librepilot\shared\uavobjectdefinition目录中:2. 在\librepilot\flight\targ ...
- Big Data(七)MapReduce计算框架(PPT截图)
一.为什么叫MapReduce? Map是以一条记录为单位映射 Reduce是分组计算
- 不要和SB理论
不要和SB理论,SB会把你拉倒和他和他一样的高度,然后用充分的经验把你打倒!!!
- 第四篇:存储库之mongodb、redis、mysql
MongoDB的简单操作 一.简介 二.MongoDB基础知识 三.安装 四.基本数据类型 五.增删改查操作 六.可视化工具 七.pymongo 一.简介 MongoDB是一款强大.灵活.且易于扩展的 ...
- 微信小程序-饮食日志_开发记录03
这段时间主要是收尾阶段. 美化界面,排版分部等. 并进行上传,审核. 环境部署一直出现问题,所以测试版食物查找查找不到. 主要问题是:https://的网页证书没有通过审核. 所以现在推行开发,调试版 ...
- vue作业1
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- MyEclipse更改项目名web发布名字不改问题
步骤: 右键项目-->选择propertis-->MyEclipse-->Project Facets-->Web-->右侧更改Web Context-root 如下图:
- jmeter--单个接口通,自动化不通时
单个接口通,自动化不通时,对比两者请求 post 请求的格式,内容编码