关于Dll和数据库的疑问,请高手指点一下。(100分)

  • 主题发起人 主题发起人 dirk
  • 开始时间 开始时间
什么是“引用计数”?在form3的onclose事件中加上Action:=caFree是否可以?

我看了帮助,有这样的一段:
var
SaveExit: Pointer;
procedure LibExit;
begin
CoUninitialize
// library exit code
ExitProc := SaveExit
// restore exit procedure chain
end;

begin
SaveExit := ExitProc
// save exit procedure chain
ExitProc := @LibExit
// install LibExit exit procedure
end.

就帮助上说的,应该是dll的释放部分:

When a DLL is unloaded, the library's exit procedures are executed by repeated calls to the address stored in ExitProc, until ExitProc becomes nil. The initialization parts of all units used by a library are executed before the library's initialization code, and the finalization parts of those units are executed after the library's exit procedure.

但就我跟踪看来,这个LibExit根本就没有执行,那么ExitProc到底该怎么用呢?
 
我知道没有打补丁的Delphi6不能跟踪Dllproc,好像delphi5可以跟踪。
 
我在procedure LibExit;中设置了断点,但是程序没有停下来。

我跟踪了dll,
begin
SaveExit := ExitProc
// save exit procedure chain
ExitProc := @LibExit
// install LibExit exit procedure
end.
发现在执行了
ExitProc := @LibExit
// install LibExit exit procedure
后ExitProc的值仍为 nil ,很奇怪,明明是将LibExit的地址赋给了ExitProc。

在帮助中找到了这两句话,看不太明白:
An exit procedure takes no parameters and must be compiled with a far procedure directive to force it to use the far call model.
这里的compiled with a far procedure directive怎么解释?

When a DLL is unloaded, the library抯 exit procedures are executed by repeated calls to the address stored in ExitProc, until ExitProc becomes nil.
这里的意思是否是:当一个dll卸载时,将执行ExitProc指向的过程,直到ExitProc为nil,
但赋了值,ExitProc却始终为nil,这是为什么?
 
你还有错误?????????

你把例子发到我信箱好不好

我今天刚试一下,没事

Nizvoo@etang.com
 
天哪,我的程序没有错误,我说的错误是针对 kkyy 说的:在dll用ado不需要用Coinitialize
初始化com组件 这点而说的,代码我上面不是贴出来了嘛!

kkyy这个人也真是的,进来扔下两句话,给他代码又不运行,邮件通知又不订,干嘛都不知道!

我的问题是:

我的问题是:

>我希望有人为我解释一下CoInitialize,CoInitializeEx,OleInitialize的区别。



>是否一定要用OleUninitialize或CoUninitialize函数去释放内存?用完就释放应该是好习
>惯,但我在程序中总是要用到这些Dll函数产生Form去操作数据库,每次都initialize,
>Uninitialize,是不是太麻烦了,也影响效率,Exe程序退出时,系统是否会自动做
>Uninitialize的工作去释放内存?



>怎样在卸载dll时执行一段代码,做些收尾的工作,帮助上的 ExitProc 好像不对,
>根本就不会执行。

唉,真累,高手在哪里,PiPi.快来吧!
 
先听课,占个位置
 
把代码发给我:zzhdi@163.com
 
Delphi帮助里头有,我想你看了,我也只是看了一下。UPUPUP
 
to zzhdi:
我的程序没有错,只是有些概念我不清楚,我的问题在上面,你再看一下。
 
我把MSDN上的部分语句贴出来,看看也许你会明白。
OleInitialize:
Initializes the COM library on the current apartment, identifies the concurrency model as single-thread apartment (STA), and enables additional functionality described in the Remarks section below. Applications must initialize the COM library before they can call COM library functions other than CoGetMalloc and memory allocation functions.
Applications that do not require the additional functionality enabled by OleInitialize should call CoInitializeEx instead of OleInitialize.

CoInitialize:
Initializes the COM library on the current apartment and identifies the concurrency model as single-thread apartment (STA). Applications must initialize the COM library before they can call COM library functions other than CoGetMalloc and memory allocation functions.
New applications should call CoInitializeEx instead of CoInitialize.

CoInitializeEx:
Initializes the COM library for use by the current apartment and specifies the apartment's concurrency model.

关于CoInitializeex,Uninitialize的执行可参照tornado_cs的帖子去写。
procedure DLLEntryPoint(dwReason: DWord);
begin
case dwReason of
DLL_PROCESS_ATTACH: CoInitialize(nil);
DLL_PROCESS_DETACH: CoUninitialize;
end;

begin
{ First, assign the procedure to the DLLProc variable }
DllProc := @DLLEntryPoint;
{ Now invoke the procedure to reflect that the DLL is attaching
to the process }
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
如果DLLEntryPoint没有执行,可能你的delphi5编译器有问题,你可以把代码发给我,我
帮您编译一下,你执行一下试试。

 
多谢 zzhdi 和 tornado_cs ,已经可以了,但是我在帮助中看到的下面这个方法怎么就不行呢?
var
SaveExit: Pointer;
procedure LibExit;
begin
CoUninitialize
// library exit code
ExitProc := SaveExit
// restore exit procedure chain
end;

begin
SaveExit := ExitProc
// save exit procedure chain
ExitProc := @LibExit
// install LibExit exit procedure
end.

 
procedure LibraryProc(Reason: Integer);
begin
case Reason of
0:
1:
2:
3:
end;
end


Dllproc=@libraryProc在DLL中不是都改用这个了么?怎么还用ExitProc?
 
关于dll的卸载的时候执行的问题:
http://www.delphibbs.com/delphibbs/dispq.asp?LID=1216529
最后提到了,dllproc是正确的,只是delphi6的话,需要补丁
 
关于 OleInitialize、CoInitialize 的问题
OleInitialize内部是调用了CoInitialize 的,但是因为OleInitialize调用CoInitialize只是其中
的一个任务,他还做了其他工作,其他工作你的程序是没必要的,是浪费资源的,所以不要用OleInitialize
CoInitializeEx主要是CoInitialize的扩展,多了一个参数可以指定并发模式,你不清楚的话不必使用这个
所以,用CoInitialize 就好了
 
多谢了Pipi.,还有个问题,可以回答一下吗?
uses ActiveX,只用OleInitialize(nil),一样也能连接数据库,我很疑惑,CoInitialize,
CoInitializeEx,OleInitialize,使用任何一个后,都可以在Dll中连接数据库,它们之间
难道没有什么区别吗?起码CoInitializeEx比其他个多个不明白是干吗的LongInt参数,我想
它们之间应该是有区别的吧?

最先,我照着帮助说的,用ExitProc做,但是ExitProc指向的过程根本不执行,我想帮助
应该没有错的,那为什么ExitProc不执行呢?难道ExitProc是没有用的?

我在procedure LibExit;中设置了断点,但是程序没有停下来。

我跟踪了dll,
begin
SaveExit := ExitProc
// save exit procedure chain
ExitProc := @LibExit
// install LibExit exit procedure
end.
发现在执行了
ExitProc := @LibExit
// install LibExit exit procedure
后ExitProc的值仍为 nil ,很奇怪,明明是将LibExit的地址赋给了ExitProc。

在帮助中找到了这两句话,看不太明白:
An exit procedure takes no parameters and must be compiled with a far procedure directive to force it to use the far call model.
这里的compiled with a far procedure directive怎么解释?

When a DLL is unloaded, the library抯 exit procedures are executed by repeated calls to the address stored in ExitProc, until ExitProc becomes nil.
这里的意思是否是:当一个dll卸载时,将执行ExitProc指向的过程,直到ExitProc为nil,
但赋了值,ExitProc却始终为nil,这是为什么?
 
再多谢Pipi.,写了帖子才发现Pipi.已经回答了我的第一个问题,谢谢。
 
ExitProc 是错误的,delphi的帮助上查 ExitProc 可以看到和你上面矛盾的东西:
ExitProc 只能用在exe里面,不能用在dll里面。
正确的方法是使用dllproc,如果你的是delphi6则需要打补丁
请完整看http://www.delphibbs.com/delphibbs/dispq.asp?LID=1216529 里面的全部贴子
 
多谢各位朋友。
 
多人接受答案了。
 
我的问题跟你一样
令我发火的是,大富翁上碰到这个问题的贴子满街都是
真正回答能用的都他妈的不能用,这个问题困了我快一个月了害得我都用不了dll
不是说啥
initialization
CoInitialize(nil);
finalization
CoUninitialize;
要不就是
var
ExitSave: Pointer;
procedure MyExit;
begin
ExitProc := ExitSave
// always restore old vector first
coUninitialize;
end;
ExitSave := ExitProc;
ExitProc := @MyExit;
然后就是什么奇奇怪怪的解释,都他妈的都是可以执行退出后地址错误
我说你们不要老在最后加上一句“可以了”
怎么可以的他妈的都不说,火死我了,
啥鬼东西,说又说不清楚都是一半一半的,具体怎么执行怎么弄都他妈的不说
其它的说那么多费话干鸟,我拷
 

Similar threads

S
回复
0
查看
738
SUNSTONE的Delphi笔记
S
S
回复
0
查看
730
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部