确定进程或库是否锁定了文件(dll / exe)

时间:2009-08-21 11:16:07

标签: c++ c windows winapi dll

我打算编写一个示例程序,用于标识某个进程锁定/使用的文件(dll文件)。

我们如何使用WIN API(C / C ++函数)以编程方式实现此目的?实际上,当我们执行某些软件升级过程时,某些其他进程可能正在使用该库,这将暂时无法升级操作。

我想带来的最好的例子是Unlocker工具,它列出了使用特定文件的所有进程/ dll。

5 个答案:

答案 0 :(得分:4)

您可以尝试自己打开文件以进行独占访问。如果任何其他进程打开它们,则应该失败。

答案 1 :(得分:1)

我认为没有编写驱动程序就无法确定进程。幸运的是,Russinovich's Handle tool包含了这样的驱动程序;我建议你运行这个工具。

答案 2 :(得分:1)

如果您不需要知道哪些进程使用了​​相关文件,您只需使用CreateFile打开该文件以进行独占访问。

::CreateFile(filename, 0, 0, 0, OPEN_EXISTING, 0, 0);

答案 3 :(得分:1)

在Windows中,文件未被“锁定”或“未锁定”。如果文件已打开,则打开时指定的共享模式将确定是否以及在何种情况下打开文件的其他尝试成功。

如果指定了FILE_SHARE_NONE标志,则该文件完全被锁定,在任何情况下都不会有任何其他尝试打开该文件。如果指定了FILE_SHARE_READ,则尝试打开具有GENERIC_READ访问权限的文件将成功,但GENERIC_WRITE将失败,例如。 FILE_SHARE_WRITE允许其他句柄打开以进行写访问,而FILE_SHARE_DELETE则相同以进行删除。

一旦确定了您认为意味着“锁定”的排除级别,您就可以尝试使用相关访问权限打开每个文件,看看它是否因ERROR_SHARING_VIOLATION而失败。

答案 4 :(得分:0)

在我看来,windows API提供EnumProcesses()以轻松获取活动processID和EnumProcessModules的列表,以获取每个进程的模块句柄列表(如果EXE和DLL与之关联);最后,GetModuleFileNameEx()为您提供已加载模块的完整路径和文件名。

因此,您可以轻松地遍历所有已加载的DLL名称,并且至少知道在检测到问题时哪个进程持有它们 - 并且可能会自动结束该进程。