人们对人工智能的担忧会发明药物吗,比如人们可以拥有异能魔法、以及万能药,吃一颗就没有任何病

Delphi中模块句柄管理,及FindClassHInstance详解 - king
第一部分、问题的提出:GetModuleHandle()和全局变量HInstance都只能得到Exe的模块句柄。 在设计企业开发框架时,因为采用的是Exe,BPL,DLL的结构:一个Exe和Bpl类库,及多个Dll窗口模块。在Bpl开发框架中设计了基类窗口、单表、主从表、多平行表、对话框
&第一部分、问题的提出: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.csdn.net/wr960204/archive//2312284.aspx
1、最近突然发现全局变量HInstance确实为当前模块句柄,查看文档也是这样说的:
HInstance provides a unique instance handle for the application or library
2、Api GetModuleHandleEx函数只支持到Xp
3、System单元中FindHInstance函数可以传入局部函数地址和全局变量地址,为什么不能是局部变量地址呢:因为D很多情况下将局部变量放在寄存器或堆栈中!
你最喜欢的Delphi中Bpl封装与动态加载_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Delphi中Bpl封装与动态加载
上传于|0|0|文档简介
&&Delphi中Bpl封装与动态加载
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢共有1395位成员   人气指数 -   最新排名 -
【话题】请教高人:C++ Builder调用Delphi窗体时,出现找不到Static library:dcloffice2k.lib的解决办法。谢谢!
19:16:37 来自:drliang1 浏览数:21次
补充:Delphi窗体中添加了几个Excel组件:如TExcelApplication(CodeGear平台)。谢谢!
郭嘉伟回复于24日19点26分 
背景:用C++ Builder调用Delphi的窗体,Delphi窗体包含了dcloffice2k120.bpl组件包,以完成导出Excel的功能。
问题:C++ Builder调用Delphi窗体(包含的dcloffice2k120.bpl),编译时却出现:Unable to find static library:dcloffice2k120.bpl,选择library location。
现在Delphi窗体包含的dcloffice2k120.bpl组件包和C++ Builder的bcboffice2k120.bpl组件包冲突,提示框图上文字:Component TWordApplication can't be registered by package bcboffice2k120.bpl& because it has already been registered by package dcloffice2k120.bpl。
聪明小子回复于24日19点38分 
咦?两面都发?先说说用的哪个版本的C++Builder和Delphi呢.
chenqy回复于24日19点49分 
加载 bcboffice2k120.bpl
可爱的猫猫回复于24日19点58分 
谢谢啊,新手向您敬礼,呵呵。
Delphi的其他话题...
热门脚本语言:温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
I have a unit wich defines TBla and the following code in the initialize section:
initialization
RegisterClass(TBla);
showMessage('registered');
This unit is inside a package. ok.
In a button click on my app I have the following code:
LoadPackage('C:\temp\testes_packs\pack1\Package1.bpl');
pc := GetClass('TBla');
if pc = nil then
ShowMessage('didnt work');
When I click the button the 'registered' message shows up. But,
'didnt work' shows too. Which indicates that the initialization wass
called but the register class for some reason didn't work.
Ok, to prove that the LoadPackage was the problem, I included my unit
(that contains TBla class) directly into my project and removed the
loadPackage line and, tada the 'registered' message shows and the
getClass works.
Any ideas?
asked Mar 31 '09 at 17:536,22072352
90% accept rate
Your package needs to include "rtl" and
"vcl" in its "requires" list. That way, the class-registration list will
be the one in the shared package and not private to your own package.
Also, your application needs to be compiled to use run-time packages.
In particular, the "rtl" and "vcl" packages need to be on its list of
run-time packages.
Without doing both those things, the class-registration list used by
one module will not be the same as the list used by the other module.
They both have to use the same one, and the way to do that is to make
sure that both modules are sharing the list exposed by the RTL.
answered Mar 31 '09 at 18:0175.4k579171
阅读(1651)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_095071',
blogTitle:'DELPHI
动态加载包(bpl) LoadPackage',
blogAbstract:'
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}}

我要回帖

更多关于 人们对人工智能的看法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信