我有一个与之通信的非托管DLL。有一个函数需要一个窗口句柄才能在上面绘制。但是,在一些MDI操作、窗体隐藏和显示之后,句柄发生了变化。不幸的是,我不能给DLL一个新的句柄,然后System.AccessViolationException就会抛出。我可以使用一些方法来防止句柄重新创建吗?
发布于 2012-08-09 06:14:07
我有一个与之通信的非托管动态链接库。有一个函数需要一个窗口句柄才能在上面绘制。但是,在一些MDI操作、窗体隐藏和显示之后,句柄发生了变化。不幸的是,我不能给DLL一个新的句柄,然后
System.AccessViolationException就会抛出。
正确的解决方案是处理HandleCreated event,并通知DLL句柄已更改。但是你说你不能给DLL一个新的句柄。(有何不可?)
我可以使用一些方法来防止句柄重新创建吗?
不,没有这样的方法。
问题是,设置窗体的某些属性会导致框架在内部重新创建基础窗口,这当然会导致窗体与不同的句柄相关联。但这不是一个bug,它解决了这样一个事实,即某些窗口样式属性在创建时被缓存,没有办法在不重新创建窗口的情况下强制更新它们。
因此,如果要确保窗口句柄永远不会更改,就必须确保永远不会更改导致框架重新创建其句柄的窗体的任何属性。
有了像ILSpy这样的东西,你就可以准确地找出那些是哪些属性/方法。罪魁祸首通常会调用一个名为RecreateHandle的方法(在某些情况下,您甚至可以调用自己来达到类似的效果)。
我想不出另一种解决方法。没有办法告诉Windows使用与旧对象相同的句柄重新创建对象。
https://stackoverflow.com/questions/11873591
复制相似问题