gpt4 book ai didi

delphi - 当我使用完 SQLite DLL 后,如果操作系统认为它仍在使用中,如何删除它?

转载 作者:行者123 更新时间:2023-12-02 14:00:17 28 4
gpt4 key购买 nike

如何解锁或删除正在使用的文件,以便将其删除?有问题的文件由我自己的应用程序使用。

更具体地说,我的应用程序使用免费软件 Zeos Lib。打开并保存数据库时,sqlite3.dll 文件必须与我的应用程序位于同一目录中才能正常工作。

我希望我的应用程序是 100% 独立的,因此我已将 sqlite3.dll 作为 RC_DATA 添加到我的项目中,每当我需要使用它(即打开或保存数据库)时,我都会将其提取到同一文件夹中作为我的应用程序。一旦打开或保存操作完成,我想删除 sqlite3.dll 文件,没有人会知道它在那里,也不必担心丢失库等。(虽然我可以理解,有些人可能不喜欢将库存储在应用程序中的想法,我这样做有我的理由:我不希望我的最终用户知道我的应用程序(SQL)功能背后的内容,而且他们也不需要担心缺少动态链接库。)

问题是,我可以成功提取 sqlite3.dll 并将其用于我的操作,但该文件被我的应用程序锁定(直到我关闭我的应用程序),这将我带到:

  1. 强制解锁 sqlite3.dll 文件,而不关闭我的应用程序

  2. 强制删除sqlite3.dll文件

当然除非还有其他建议?

这是提取和使用它的示例。我不需要直接调用 LoadLibrary 等;只要 sqlite3.dll 与应用程序位于同一目录中,Zeos Lib 单元就必须处理此问题。

procedure ExtractResource(ResName: String; Filename: String);
var
ResStream: TResourceStream;
begin
ResStream:= TResourceStream.Create(HInstance, ResName, RT_RCDATA);
try
ResStream.Position:= 0;
ResStream.SaveToFile(Filename);
finally
ResStream.Free;
end;
end;

//Open procedure
var
sFileName: String = ExtractFilePath(ParamStr(0)) + 'Sqlite3.dll';

if OpenDialog1.Execute then
begin
ExtractResource('RES_SQLITE3', sFileName);
... //process my database
...
... // finished opening database
if FileExists(sFileName) then
DeleteFile(sFileName);
end;

编辑

我认为我尝试做的事情不是很实际,正如 STATUS_ACCESS_DENIED 之前评论的那样,这不是一个好主意。我决定最好不要继续我打算做的事情。

最佳答案

您应该更好地使用 SQLite3 引擎的静态链接,而不是依赖外部 dll。通过将 .obj 包含到您的 .dcu SQLite3 单元中。

它还将添加一些不错的功能,例如使用 FastMM4 作为 SQlite3 引擎的内存管理器的能力(加速),以及潜在的一些不错的低级功能(例如加密)。

例如:

关于delphi - 当我使用完 SQLite DLL 后,如果操作系统认为它仍在使用中,如何删除它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6020446/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com