我正在开发一个资源泄漏检测工具来监控我的应用程序中句柄的生命周期。对于句柄,我的意思是窗口句柄、画笔句柄、图标句柄、事件句柄等。
我通过挂钩 api 函数来做到这一点。例如,为了监视文件句柄,我通过在导入表中查找它们的地址来挂钩 CreateFileW 和 CloseHandle 函数,并将它们替换为我自己函数的地址。我自己的 CreateFileW 函数调用原始函数并将句柄存储在列表中。我自己的 CloseHandle 函数调用原始函数并从列表中删除句柄。
通过这种方式,我可以检测到泄漏或被破坏两次的句柄。
我还想挂钩 SHGetStockIconInfo 函数,因为它可以返回一个图标的句柄,该句柄必须由 DestroyIcon 函数销毁。问题是,由于某种原因,SHGetStockIconInfo 函数没有出现在导入表中。请注意,我在内存导入表中进行搜索。该函数由 shell32.dll 导出。我能找到的仅有的两个 sheel32 函数是 SHGetFileInfoW 和 Shell_NotifyIconW。
请注意,此函数实际上是在可执行文件中使用的。调用该函数就可以了。该函数由 WinAPI.ShellAPI Delphi 单元(作为外部)导入。
现在是我的问题。我的可执行文件的内存导入表中怎么可能不存在 SHGetStockIconInfo?不应该在此表中列出所有导入的函数吗?
顺便说一句,我用的是Delphi XE2,但是C或C++的例子都没有问题!
我的目标平台是 Windows 7。