有没有办法获取进程的所有打开文件句柄并按文件打开时间安排它?我们有一个项目,正是需要这个 - 我们需要确定哪些文件是由 Dj 软件打开的,例如 Traktor 或 Serato。我们需要知道它的顺序的原因是要确定哪个文件在第一个卡组中,哪个在第二个卡组中。
目前,我们正在使用来自 Ntdll.dll (Winternl.h) 的 Windows 内部 API 来确定进程的所有打开文件的列表。也许这不是最好的方法。任何建议都受到高度赞赏。
我们依赖于在某些操作系统版本和某些 Dj 软件版本上观察到的 API 行为,即进程的所有打开文件列表永远不会重新排列,即遵循顺序。我知道这是一种不好的做法,但这是客户在发布之前“应该”的功能,所以我们不得不这样做。现在的问题是,当这些句柄有时在没有任何特定原因的情况下随机重新排列时,我们遇到了一个错误。那会阻止一切。我想也许那些win结构中会有一个字段来获取文件的打开时间,但似乎没有这样的东西。有关该 API 的文档非常糟糕。
我想到了一些代码粘贴,但它是一个 200 行长的函数,它使用函数指针从 dll 间接调用,并且 WinAPI 的所有结构都是手动重新定义的,所以真的很难阅读。实际上,甚至没有包含 Winternl.h 标头 - 所有内容也是手动加载的,如下所示:
GetProcAddress( GetModuleHandleA("ntdll.dll"), "NtQuerySystemInformation" );
对于一个跨平台的应用来说,真的很头疼……
PS我在这里发布了一个相关的问题,关于任何跨平台或Qt方式来获取打开的文件句柄,也许这些东西会有用或相关。