有一个在dll中使用的图形库,加载到进程中。似乎库泄漏(在加载/卸载几次GDI句柄计数在进程资源管理器属性对话框不断增长的整个进程)。
是否有一种方法来存储由dll创建的所有GDI句柄在一个进程中删除所有dll卸载后?比如说,钩子CreateBitmap()等等?但是如何确定资源是由我们的dll创建的,而不是进程本身?
认为,
是否有一种方法来存储由dll创建的所有GDI句柄在一个进程中删除所有dll卸载后?比如说,钩子CreateBitmap()等等?但是如何确定资源是由我们的dll创建的,而不是进程本身?
。您需要从源头上解决这个问题。如果DLL确实在泄漏句柄,您必须修复DLL。
关闭DLL打开的所有句柄并释放所有资源的一种方法是使用一个单独的进程,该进程加载DLL并在DLL卸载后终止。因此,您可以评估哪个工作更大:修复DLL,找到另一个DLL(它不会泄漏,可能没有许多其他缺陷),或者实现进程间通信以释放句柄并仍然使用DLL。如果您选择后一种方式,您可以使用共享内存块在进程之间传输绘制的位图,使用命名事件进行同步等。
要确定调用者,您必须获得每个调用的堆栈跟踪,请查看RtlCaptureStackBackTrace。
我尝试做的另一种方式是修改这个DLL(我假设你只有一个DLL二进制文件,而不是源代码:否则你可以修复泄漏),使它使用GDI33.DLL而不是GDI32.dll。然后创建GDI33.DLL,导出该dll使用的那些函数。GDI33.DLL转发对GDI32.dll的调用并收集GDI对象句柄