我们编写了一个 DLL 来执行我们所有的打印功能。它允许我们进行打印预览、打印以及生成 PDF。
我们现在有一个特定的 DLL 使用模式,之后 DLL 无法正确卸载。结果就是当我们退出主程序时,它消失了,但并没有终止,我们不得不手动杀死进程。
我想罪魁祸首是某些 GDI 资源没有被适当地“关闭”(当我这样说时,我是出于对 GDI 的无知而说的)。我们不直接处理 GDI 资源,而是在我们使用各种 Delphi 组件时为我们使用 GDI 资源。
有关如何查找和解决此类问题的任何提示?我们使用 GDIView 来确认在我们尝试终止程序后仍有一些 GID 资源,但我不知道如何将这些 Windows/内核句柄与底层 Delphi 代码相关联。我可以在程序执行期间的不同时间提供 GIDView 列表。
谢谢!
乔恩(德尔福 2007)
我回应了提出的建议,但没有人回应我的回应。最终,我放弃了。我最终编写了一个自杀例程,它不仅会杀死我自己的进程,还会杀死所有其他同名进程,以此作为解决问题的一种方法。可笑的矫枉过正,但我似乎别无选择。我正在使用我在某处找到的免费软件 ProcessInfo 工具。
procedure KillNamedProcesses(pName : String);
// used to clean up programs that hang as a result of DLLs not unloading
var
ProcessInfo : TProcessInfo;
ProcessName : String;
i : INTEGER;
currentPID : cardinal;
BEGIN
currentPID := GetCurrentProcessID;
pName := UpperCase(pName);
ProcessInfo := TProcessInfo.Create(nil);
// kill all old processes (not our process)
for i := 0 to ProcessInfo.RunningProcesses.Count - 1 do begin
ProcessName := ProcessInfo.RunningProcesses[i].ExeFile;
IF (UpperCase(ProcessName) <> pName) THEN CONTINUE;
IF (currentPID <> ProcessInfo.RunningProcesses[i].ProcessID) then
ProcessInfo.RunningProcesses[i].TerminateProcess;
END;
// kill the last one (ourselves)
for i := 0 to ProcessInfo.RunningProcesses.Count - 1 do begin
ProcessName := ProcessInfo.RunningProcesses[i].ExeFile;
IF (UpperCase(ProcessName) <> pName) THEN CONTINUE;
ProcessInfo.RunningProcesses[i].TerminateProcess;
END;
ProcessInfo.Free;
END; // KillNamedProcess