我需要调用API
CallWindowProc((WNDPROC)lpfnOldProc, hWnd, Message, wParam, lParam);
现在我如何确保lpfnOldProc
仍然有效?
基本上,lpfnOldProc
是另一个dll中的过程,如果该dll被卸载,那么lpfnOldProc
仍会指向某些内容但无效的内存?
是否有一些内存API可用于验证lpfnOldProc
的有效性?
答案 0 :(得分:4)
别担心。你显然是在一个钩子过程中。现在,即使在您缺席的情况下,如果原始窗口proc被卸载并调用,程序也会崩溃。你现在是调用者而不是Windows,这没关系。
只要存在使用它的窗口,Window Proc就应该保留在内存中。此检查的责任在于完全,代码考虑卸载,而不是Window Proc的调用者(即您)。这个责任可归纳为一行:“不要卸载任何仍在使用中的东西。”
答案 1 :(得分:1)
你无法检查。您可以设置结构化异常处理,以捕获有问题的DLL已经消失或被映射到内存中的Encyclopedia Brittanica副本替换的错误。
答案 2 :(得分:0)
在传递中发生了类似的事情,命名两个或更多dll试图覆盖窗口proc。通常作为进程关闭或插件卸载的一部分,他们尝试恢复“oldWndProc”,但由于他们彼此不了解,他们可能最终用无效指针覆盖一个好的指针然后崩溃。
如果你有权访问源代码,你可以做的最好的事情是只有一个dll负责挂钩窗口proc,然后其余的可以实现一种委托,所以当unloding它可以设置为null,并且挂钩dll可以检查,如果它为空,则跳过该呼叫。
如果您无法访问源代码,可能是因为您尝试使用已经非常流行(并且有错误)的插件使您的dll工作,您可能会尝试找到可重复的过程,以便您可以检测到这种情况腐败发生之前的腐败(在崩溃之前检查一些消息),并使用自定义消息通知你的wndproc解决它。