- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Delphi 中有一个单元(可以选择)提供单个全局对象:
var
InternalThemeParkServices: TThemeParkServices;
function ThemeParkServices: TThemeParkServices;
begin
if InternalThemeParkServices= nil then
InternalThemeParkServices := TThemeParkServices.Create();
Result := InternalThemeParkServices ;
end;
...
initialization
finalization
FreeAndNil(InternalThemeServices);
end.
我在进程关闭期间毁了自己。
Note: Another code variant is:
var
InternalThemeParkServices: IThemeParkServices;
function ThemeParkServices: TThemeParkServices;
begin
if InternalThemeParkServices= nil then
InternalThemeParkServices := TThemeParkServices.Create();
Result := InternalThemeParkServices ;
end;Where the interface variable is implicitly destroyed when it's reference count goes to zero during program shutdown
当我的对象不再使用时(即在其析构函数
期间),我调用各种 WinAPI 函数。
问题是,如果有人从 DLL 中使用我的类(我无法控制的东西),那么在此期间将调用任何内容:
finalization
在德尔福道德中相当于 DLL_PROCESS_DETACH
。 There是all kinds of things我should not be doing during DLL_PROCESS_DETACH
when the process is terminating (例如CoCreateInstance
)。
我知道 Embarcadero 使用:
initialization
if not IsLibrary then
begin
...
我也许可以适应,改变我的代码:
var
InternalThemeParkServices: IThemeParkServices;
(使用隐式清理),至:
var
InternalThemeParkServices: IThemeParkServices;
...
finalization
if IsLibrary then
Pointer(InternalThemeParkServices) := nil; //defeat reference counting and let the object leak
end;
并让它泄漏。
但这就是最好的解决方案吗?我假设这意味着如果运行我的代码的 dll 被卸载(但不是在进程关闭期间),我将泄漏内存。如果附加和分离 dll,每次都会泄漏。
我真正想要的是Delphi在ExitProcess
/DllMain(之前运行其
。这可能吗?finalization
block DLL_PROCESS_DETACH)
@pa破译the Delphi application shutdown scheme :
The hierarchy of shutdown is as follows
Application.Terminate()
performs some unidentified housekeeping of application
calls Halt()
Halt()
calls ExitProc if set
alerts the user in case of runtime error
get rid of PackageLoad call contexts that might be pending
finalize all units
clear all exception handlers
call ExitprocessProc if set
and finally, call ExitProcess() from 'kernel32.dll'
ExitProcess()
unloads all DLLs
uses TerminateProcess() to kill the process
在调用 ExitProcess
之后,DLL 被卸载 - 因为 Windows 是执行此操作的人。
最佳答案
要判断调用 ExitProcess 后是否在 DLL_PROCESS_DETACH 期间调用您,您可以为库编写初始化代码,以便在从主程序调用 FreeLibrary
时执行您的代码。如果已经调用了ExitProcess,则“lpReserved”参数将为“1”,否则为“0”:
..
var
SaveDllProcEx: TDllProcEx;
procedure DllMainEx(Reason: Integer; Reserved: Integer);
begin
if (Reason = DLL_PROCESS_DETACH) and (Reserved = 0) then
// Main app is still running, cleanup.
if Assigned(SaveDllProcEx) then
SaveDllProcEx(Reason, Reserved);
end;
initialization
if IsLibrary then begin
SaveDllProcEx := DllProcEx;
DllProcEx := @DllMainEx;
end;
来自 DllMain entry point :
The lpReserved parameter indicates whether the DLL is being unloaded as a result of a FreeLibrary call, a failure to load, or process termination.
关于delphi - 在调用 ExitProcess 后,如何判断我是否在 DLL_PROCESS_DETACH 期间被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10353417/
我在 Delphi 中有一个单元(可以选择)提供单个全局对象: var InternalThemeParkServices: TThemeParkServices; function Theme
我在处理用 Delphi 编写的 DLL 时遇到了很多麻烦。我已经使用库中的以下代码设置了一个 DllMain 函数: begin DllProc := DllMain; end. 我的 DllM
我是一名优秀的程序员,十分优秀!