Delphi中模块句柄管理,及FindClassHInstance详解

delphi获取控件句柄,并获取属性源码 Delphi获取鼠标指定的空间的句柄,并获取控件的类名和属性值。鼠标拖动点击的特效,非常实用,功能简单,自己开发勿喷。 立即下载

 第一部分、问题的提出:GetModuleHandle()和全局变量HInstance都只能得到Exe的模块句柄。

     在设计企业开发框架时,因为采用的是Exe,BPL,DLL的结构:一个Exe和Bpl类库,及多个Dll窗口模块。在Bpl开发框架中设计了基类窗口、单表、主从表、多平行表、对话框、数据编辑对话框等等模板,而这些窗口统一由窗口类工厂创建释放,并由主窗口模板创建类工厂接口实例进行管理。创建的窗口有二种形式:MDI子窗体和内嵌在页控件中的普通窗口。

     其中实际的业务处理功能模块放在DLL中,这样做好处有二点:便于Team开发,每人负责一个模块对应一个DLL;Dll方便动态调入执行,且比BPL更高效~可用VS中的Depends工具比较看看就知道了!!

     这样,窗口类工厂除了要管理具体的窗口,还得需要处理模块的装卸,不可避免的须与模块句柄打交道。当我们用GetModuleHandle这个API发现给传入它空指针参数,并不是返回调用模块DLL或BPL的句柄,而一直返回的是Exe的(更正:其实应该都是Bpl的句柄,因为这部分代码都是在框架代码BPL中)。试着用全局变量HInstance,和GetModuleHandle的效果一样。

 Google了一下,只找到了C++的解决方法:传入函数指针,用VirtualQuery返回函数所在模块基地址,也即是模块句柄。而开发框架的基类窗口模板需要通知类工厂窗口的释放,这就需要向类工厂传递窗口所在Dll的模块句柄(DLL有一规则:哪个模块创建则由哪个模块释放,不然.....)。即使强行在基类窗口增加一个全局空函数(什么也不干的),以得到它的指针来获取模块句柄,但基类窗口是作为模板封装在BPL中,这样做得到只是Bpl的句柄。

 

第二部分、解决之道

    方法一,最直接最笨的方法:动态调入Dll时保存句柄并传入到Dll,没什么好说的。

    方法二,FindClassHInstance( ),此函数在System.pas单元中,而且可用于Win 和LinuX ,它在Win下的实现也是VirtualQuery函数,不同的是它将类引用TClass作为指针传给VirtualQuery( )。哈,类引用,正好用在窗口模板中。在开发框架中,每个由窗口类工厂直接创建的窗口都须注册,这样外部只须传入窗口类名就可调用它。在基类窗口模板这样就可动态得到实际窗口所在的模块句柄了:

   FindClassHInstance(Self.ClassType);

得到模块句柄后,向类工厂发送消息通知窗口的释放事件。

 

小贴士:其实Delphi中,很多东东的本质都是指针:接口实例、对象实例、类引用TClass、函数指针、方法的代码指针,理解了,我们用TLIst很好进行管理!

 

补:前些日子在武稀松的博客上看到一新的方法,汗(还是没高手的钻研精神,向他们学习)

   HMODULE hModule = NULL;

        GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,  

          (LPCSTR)&XXX, //可以是任何函数,全局变量等的地址

           &hModule);

 

该方法的原文链接:

http://blog.youkuaiyun.com/wr960204/archive/2008/04/21/2312284.aspx

 

后记:

1、最近突然发现全局变量HInstance确实为当前模块句柄,查看文档也是这样说的:

HInstance provides a unique instance handle for the application or library

 

2、Api GetModuleHandleEx函数只支持到Xp

 

3、System单元中FindHInstance函数可以传入局部函数地址和全局变量地址,为什么不能是局部变量地址呢:因为D很多情况下将局部变量放在寄存器或堆栈中!

 

2009-03-17

DELPHI 读取&修改内存数据 DELPHI 读取&修改内存数据源代码,可读取或修改指定内存地址中的数据 立即下载

相关推荐

Golang实战:用Quic-Go v0.46.0搭建高性能文件传输服务(附完整代码)

本文详细介绍了如何使用Golang和Quic-Go v0.46.0构建高性能文件传输服务,涵盖服务端和客户端的完整实现。通过QUIC协议的多路复用、零RTT连接等特性,显著提升文件传输效率,特别适合高延迟或不稳定网络环境。文章提供完整代码示例和性能调优技巧,帮助开发者快速部署高效的文件传输解决方案。

weixin_33737134的博客 448

Delphi使用FindClass实现动态建立对像(有点像反射)

    相关资料:http://www.blogjava.net/nokiaguy/archive/2008/05/10/199739.html  1 { 2 http://www.blogjava.net/nokiaguy/archive/2008/05/10/199739.html 3 在delphi中动态建立类的实例可分为4步。 4 1. 声明一个从TPersis...

weixin_33949359的博客 1195

基于VH6501的Busoff测试

摘要: 本文介绍使用VH6501和CANoe工具测试ECU的Busoff Recovery机制。通过干扰报文触发Busoff状态,验证快恢复(连续32次,间隔100ms)和慢恢复(间隔1000ms)的时序及次数是否符合要求。测试步骤包括硬件配置、干扰参数设置及Trace窗口错误帧分析,最终通过错误帧间隔判定恢复机制的正确性。

酒酿丸子的博客 1039

WinAPI: GetModuleHandle - 获取一个模块(exe 或 dll)的句柄

定义: GetModuleHandle( lpModuleName: PChar {模块名; 只能是映射到当前进程的模块} ): HMODULE; {返回模块句柄; 0 表示失败} 举例: //获取当前模块的句柄 var s: string; h: Cardinal; begin {先取得模块名} s := Appl...

weixin_33826609的博客 766

Windows10下MATLAB2017a安装与破解实战:手把手教你搞定双镜像加载

本文详细介绍了在Windows 10系统下安装和破解MATLAB 2017a的完整步骤,包括双镜像加载、许可证配置及常见问题解决方案。通过手把手教程,帮助用户顺利完成安装并优化性能,特别适合工程计算领域的初学者和专业人士。

weixin_29053383的博客 419

内存学习(3):DRAM的基础存储结构(存储层级、读写过程,刷新与暂存)

DRAM,全称为 Dynamic Random Access Memory ,中文名是“动态随机存取存储器”。所谓“动态”是和“静态”相对应的,芯片世界里还有一种 SRAM 静态随机存取存储器的存在。笼统地说,DRAM 的结构比 SRAM 更简单,面积占用更小,适合制作大容量的存储芯片;而 SRAM 结构复杂一些,一般使用六个晶体管,面积消耗大,但是读写速度快,而且因为 SRAM 只用到晶体管,所以在工艺上和逻辑芯片相兼容,我们可以在逻辑芯片上直接集成 SRAM。

呆呆象呆呆的博客 2万+

Delphi 动态创建类

昨天在看 Java Web 开发时有看到servlet 通过反射动态创建类,想到Delphi中能否实现。 环境 Win10 x64 , Delphi 10.4 需引用System.Rtti ; 发现 private 下的function GetXY:Integer 没有获取到,why? Rtti设计就这样? unit untTest; interface uses Classes,SysUtils,Dialogs; type TTestClass = class(TPer...

xhfbx的博客 725

YOLOv11改进 | Conv篇 | 图像去雾卷积DEConv助力yolov11有效涨点(部署零额外开销)

本文介绍了一种最新改进机制用于低层视觉任务的细节增强卷积(DEConv)机制。DEConv在训练阶段采用"普通卷积+差分卷积"的多分支并联结构,增强网络对边缘、纹理等细节特征的学习能力;在推理阶段可折叠为标准3×3卷积,保持与普通卷积相同的计算效率。文中详细阐述了DEConv的工作原理、实现方法以及在YOLOv11中的应用步骤,包括核心代码解析、模型修改方法和训练配置。实验表明,该机制在去雾、去噪、超分等强调细节重建的任务中具有显著优势。文章还提供了完整的代码实现和训练指导.

Snu77的博客 2435

delphi Getclass findClass用法

var   className: string;  HelperClass: THelperClass; begin   Result := nil;   className := FConfig.ReadString('Configuration', 'className', '');   if className = '' then     Exit;   if

shandiantianying的专栏 3775

Qt Installer Framework 简单使用

qt installer framework 简单使用

qq_42815643的博客 2576

SAR成像专栏目录

为方便大家阅读,我做了一个专栏目录,蓝色字有超链接,可以直接打开。 本专栏默认读者已具备雷达系统的基本知识或者已阅读过雷达导论专栏中的文章。 1. 概述 SAR成像概述 星载SAR的各项指标解读(史上最全) SAR成像算法的实现途径与算力分析 2. SAR成像原理与SAR系统简介 雷达与分辨率 SAR成像原理与方法 SAR图像的形成和处理 SAR系统设计 3. 点目标仿真 点目标仿真(一)—— 数学模型 点目标仿真(二)—— Matlab仿真 4. 成像算法 更新中 雷达导论专

7464

在delphi中如何动态建立类的实例

引言    在面向对象语言中,用两种方法建立类的实例:静态建立和动态建立。静态建立就是在程序中显式地建立类的实例,如c1 = TClass1.Create()。而动态建立是在只知道类名的前题下建立类的实例。动态建立在实现上要比静态建立更灵活,因为动态建立无需引用被建立类,并且更容易实现如多态等面向对象特性。一、    动态建立类的实例在delphi中动态建立类的实例可分为4步。1. 声明一个从TP

我的新blog:<http://nokiaguy.blogjava.net> <http://nokiaguy.cnblogs.com> 1888

【ROS2】从yaml文件中读取参数配置

ROS2:从yaml中读取参数,到节点;使用C++演示参数的增、删、改、查、遍历、监听变化

郭老二 1284

Delphi中模块句柄管理,及FindClassHInstance详解(转)

第一部分、问题的提出:GetModuleHandle()和全局变量HInstance都只能得到Exe的模块句柄。 在设计企业开发框架时,因为采用的是Exe,BPL,DLL的结构:一个Exe和Bpl类库,及多个Dll窗口模块。在Bpl开发框架中设计了基类窗口、单表、主从表、多平行表、对话框、数据编辑对话框等等模板,而这些窗口统一由窗口类工厂创建释放,并由主窗口模板创建类工厂接口实例进行...

weixin_34109408的博客 141

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Delphi 的RTTI机制浅探(续)

http://www.delphibbs.com/delphibbs/dispq.asp?LID=2421470 本文是《Delphi 的RTTI机制浅探》的续篇,上篇地址在:  http://www.delphibbs.com/delphibbs/dispq.asp?lid=2420610本文上篇基本上是 RTTI 入门介绍,续篇介绍了所有 TypInfo.pas

老高的博客 1163

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Delphi 查找标题已知的窗口句柄,遍历窗口控件句柄

查找标题已知的窗口句柄,遍历窗口控件   有了回调函数的概念及上面的例子,我们可以继续了。其实想要找到一个标题已知的窗口句柄,用一个API函数就可以了:FindWindow. 其函数原形是: function FindWindow(lpClassName, lpWindowName: PChar): HWND;stdcall; lpClassName:窗口类名.如果只知道标题,可以为空.

youthon的专栏 1万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Delphi与进程、窗口句柄、文件属性、程序运行状态

uses TLHelp32,PsAPI; Delphi显示进程列表 procedure TForm1.Button2Click(Sender: TObject); var lppe: TProcessEntry32; found : boolean; Hand : THandle; P:DWORD; s:string; begin ListBox1.Items.Clea...

小宇飞刀的BLOG 980

Delphi 通过字符串实例化类

通过字符串创建窗体类对象 1、需要在程序初始化的时候将类注册,注册到对象 RegGroups:(TRegGroups)中,以便查找。 注册类使用的函数:RegisterClass ,窗体初始化操作放在initialization 中。 unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classe...

qq_18932003的博客 420

Delphi通过名字创建类实例

1、注册类 procedure TMainForm.FormCreate(  Sender: TObject); begin  RegisterClass(TFirstForm);

QinXiongWei的专栏 2001

delphi注册类信息 根据类名创建实例

initialization RegisterClass(TTestSub1); finalization UnregisterClass(TTestSub1);   var obj : TTest; clsName = 'TTestSub1'; obj := TTestClass(FindClass(clsName)).Create   RegisterClasses([T

2050

[转载]关于Delphi中HInstance说明

2010-04-09 14:56 本文转自 “猪悟能's博客” 几乎每一个提取资源的例子都用到了 HInstance, 做个对比测试:... var h,a,f: Cardinal; begin h := HInstance; a := Application.Handle; f := Self.Handle; ShowMessage(IntToStr(h

coolhao123的专栏 1406

delphi加载c语言dll文件路径,Delphi的Dll中获取文件路径

一、获取Dll自身路径1)方法一:Function GetDllPath(sDllName:string):string;varModuleFileName:array[0..255] of char;begin//{取得dll的实际位置}GetModuleFileName(GetModuleHandle(sDllName), @ModuleFileName[0],SizeOf(ModuleFil...

weixin_33492770的博客 557

GetModuleHandle函数参数传递方式对其调用方式的影响

GetModuleHandle函数的作用是获取一个应用程序或动态链接库的模块句柄 其函数原型为 HMODULEGetModuleHandle (LPCWSTR lpModuleName); 为此,在第一次进行函数调用是,我用如下方式传入了函数的形参 HINSTANCE g_hInst2; g_hInst2= GetModuleHandle((LPCWSTR)"dll2.dll"); 结

firechungelaile的专栏 2179
上一篇: cxGrid滚动Bug和数据分页的解决办法
下一篇: Delphi中的压缩单元ZLib.pas中二个鲜为人知的二个“指针”全局函数CompressBuf()和DeCompressBuf()
king_xing
博客等级 码龄25年 35粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值