我有一个正在与之通信的非托管 DLL。有一个函数需要一个窗口句柄来绘制。但是,在一些 MDI 操作、表单隐藏和显示之后,句柄会发生变化。不幸的是,我无法为 DLL 提供新句柄,然后引发 System.AccessViolationException。我可以使用某种方法来防止句柄重新创建吗?
问问题
768 次
1 回答
4
我有一个正在与之通信的非托管 DLL。有一个函数需要一个窗口句柄来绘制。但是,在一些 MDI 操作、表单隐藏和显示之后,句柄会发生变化。不幸的是,我不能给 DLL 一个新的句柄然后
System.AccessViolationException
引发。
正确的解决方案是处理HandleCreated
事件并通知 DLL 句柄已更改。但是你说你不能给DLL一个新的句柄。(为什么不?)
我可以使用某种方法来防止句柄重新创建吗?
不,没有这样的方法。
问题是设置表单的某些属性会导致框架在内部重新创建底层窗口,这当然会导致您的表单与不同的句柄相关联。但这不是错误,它解决了某些窗口样式属性在创建时被缓存的事实,并且没有办法在不重新创建窗口的情况下强制更新它们。
所以如果你想确保窗口句柄永远不会改变,你必须确保你永远不会改变导致框架重新创建它的句柄的任何表单属性。
借助ILSpy 之类的东西,您可以准确找出它们的属性/方法。罪魁祸首通常会调用一个名为的方法RecreateHandle
(在某些情况下您甚至可以调用自己来实现类似的效果)。
我想不出另一种解决方法。没有办法告诉 Windows 使用与旧对象相同的句柄重新创建对象。
于 2012-08-08T22:14:07.317 回答