高难度问题。需要顶级选手解答,得像周爱民这样的人才有希望 ( 积分: 50 )

  • 主题发起人 主题发起人 clxbase
  • 开始时间 开始时间
C

clxbase

Unregistered / Unconfirmed
GUEST, unregistred user!
情况是这样的,我做了一个个头比较大的bpl,该bpl没有require任何其他bpl,也就是说,rtl等东西都编译在里面了。我在另一程序中通过LoadLibrary调用该bpl,在其中的一个函数中,我对bpl進行初始化,写InitializePackage(hInstance)。结果,发现了一个奇怪的现象,那就是,如果bpl包含了某些第三方组件的Unit,则调用该函数的时候,会报AV错误。经过我的追踪,发现问题出现在InitializePackage函数中,進一步追踪,在InitializePackage(SysUtils.pas)中:

procedure InitializePackage(Module: HMODULE);
type
TPackageLoad = procedure;
var
PackageLoad: TPackageLoad;
begin
CheckForDuplicateUnits(Module);
@PackageLoad := GetProcAddress(Module, 'Initialize'); //Do not localize
if Assigned(PackageLoad) then
PackageLoad
else
raise EPackageError.CreateFmt(sInvalidPackageFile, [GetModuleName(Module)]);
end;

发现异常出在PackageLoad一句上,也就是调用当前bpl的名叫‘Initialize’的导出函数中。那么,在Delphi编译的bpl的动态库入口函数中,似乎为每个unit作了一定的初始化调用,似乎每个unit在编译后都生成了一个隐含的函数体,负责对该unit進行一定的初始化工作,而每个Unit对应的这个隐含的函数都汇总到dll入口函数Initialize函数中被统一调用。那么奇怪的问题来了:我诧异的发现,出现问题的Unit并没有initialization部分,那么,是在干什么的时候导致的AV呢?除了initialization以外,还有哪些情况会导致在Unit的隐含初始化函数中产生内容呢?const值的初始化会不会在动态库加载的时候進行?

这个问题恐怕得像周爱民(《Delphi源码分析》作者)这样的人才可能回答。
 
这个问题出现的没有什么道理,按理说,如果我的unit里面没有initialization部分,那么我在bpl中加入该unit,应该不影响调用InitializePackage啊,这样看来,恐怕得用汇编一级的视野调查bpl这东西到底编译成了什么样子。如果这个bpl中只有Delphi自己带的VCL,就不会出现问题。可是对于一部分的第三方unit,就可能在调用InitializePackage时出现AV,我发现这些Unit的个头都比较大,大致都超过了5000行。如果把unit的内容都去掉,仅保留uses、const,则AV消失。
 
大哥, 我觉得啊,你使用 package的方法就不对.

LoadPackage 知道吗 ? 用这个函数,使用 package,就方便多了

每个包都应该象 delphi本身那样,动态加载,动态使用. 不用的时候随时卸载,而你的方法我怎么看,都象是在使用 dll呢?
 
鄙视dcms!
 
TO: 甲马 真不知道你是个什么东西?除了瞎叫了,你还会干啥? 有本事去写一个比我这个程序好的,否则,除了告诉大家你是一只会叫的狗以外,你还能说明什么呢? 对了是不是白痴大家心里很清楚~~~~~~ 看了我的程序之后,你是不是认为你只能在这里学狗叫了?别的什么都不会了~~ 所以只有到处瞎叫了~~~~ 我觉得你注册了那么多马甲 为什么不注册一个 "狗叫" 呢? 真奇怪啊~~~~~~~

哈哈,狗就是狗,到哪都改不了狗的本性啊~~~~~~~ 哈哈

TO: 甲马 哈哈,狗终于暴露本性了啊~~~~~~ 原来就是 51zhan 这条DFW的败类,专门做黄色网站的败类啊~~~~~
 
甲马快出来啊,别替我再背黑锅了,dcms这鸟,越来越不像鸟了,他要飞了!飞起来就是鸟人了!
 
我不是说得很清楚吗?正是因为特殊的目地,我才这么干。如果是LoadPackage,那就好办了。正是因为宿主程序是第三方程序,不可改变,只能用LoadLibrary,所以,我就把Package的初始化工作放到了具体被调用的函数中,让这个bpl的行为模拟dll的行为。如果宿主程序是我自己写,那我就不必这么罗嗦了。
 
dcms是龟孙,不用理他,鄙视dcms!
打扰楼主问问题了,不好意思,抱歉之至!
建议楼主另开一贴吧!
 
TO: clxbase 杨大哥,是在不好意,最近小弟不知怎么了,被一条疯狗盯上了,请多包涵啊!
 
如果有人说:那你干脆用dll得了,何必用bpl呢?
我只能回答:还是那句话,这种客观场景有其背景和目地,都是不可变的。如果稍微换一个条件,我就不必问了。所以对我的做法的质疑的话都不用再提,你们只能在我说的这个条件下解决问题。
 
TO: clxbase 杨大哥,实在不好意,最近小弟不知怎么了,被一条疯狗盯上了,请多包涵啊!
 
dcms套近乎,不要脸!
想要知道我为什么骂你,你就好好检讨下你自己的行为吧!
你的言语实在太让人看不过去了,我才跳出来鄙视你的。
 
哈哈,狗就是狗,到哪都改不了狗的本性啊~~~~~~~ 哈哈
 
这鸟人真的飞起来了。
 
TO: 甲马 狗就是狗,到哪都改不了狗的本性啊~~~~~~~ 哈哈
 
dcms鸟人=尿扔,哈哈
 
TO: dcms你这龟孙 仔细看了一下,发现 dcms你这龟孙 确实是 甲马,真是一条疯狗

真有本事就去做一个比 dcms强的出来给大家看看,在这里学狗叫, 算男人吗?
 
xuzhic2007 说的对 真有本事就去做一个比 dcms强的东西出来给大家看看,在这里叫算什么本事! 哈哈
 
哈哈,没本事的就喜欢瞎嚷嚷, 拿东西出来比武定高低~~
 
dcms你这龟孙 在别人的贴子中捣蛋就是你的不对啦
dcms,注册这么多马甲自己帮自己说话,不觉得可悲吗?
 
后退
顶部