通信しているアンマネージDLLがあります。描画するためにウィンドウハンドルが必要な関数があります。ただし、MDIを操作した後、フォームの非表示と表示を行うと、ハンドルが変更されます。残念ながら、DLLに新しいハンドルを与えることができず、System.AccessViolationExceptionが発生します。ハンドルが再作成されないようにする方法を使用できますか?
1 に答える
通信しているアンマネージDLLがあります。描画するためにウィンドウハンドルが必要な関数があります。ただし、MDIを操作した後、フォームの非表示と表示を行うと、ハンドルが変更されます。残念ながら、DLLに新しいハンドルを与えてから、
System.AccessViolationException
レイズすることはできません。
適切な解決策は、イベントHandleCreated
を処理し、ハンドルが変更されたことをDLLに通知することです。しかし、DLLに新しいハンドルを与えることはできないとあなたは言います。(なぜだめですか?)
ハンドルが再作成されないようにする方法を使用できますか?
いいえ、そのような方法はありません。
問題は、フォームの特定のプロパティを設定すると、フレームワークが基になるウィンドウを内部で再作成することです。これにより、もちろん、フォームが別のハンドルに関連付けられます。ただし、これはバグではありません。特定のウィンドウスタイル属性が作成時にキャッシュされ、ウィンドウを再作成せずにそれらを強制的に更新する方法がないという事実を回避しています。
したがって、ウィンドウハンドルが変更されないようにする場合は、フレームワークがハンドルを再作成する原因となるフォームのプロパティを変更しないようにする必要があります。
ILSpyのようなもので武装して、あなたはそれらがどのプロパティ/メソッドであるかを正確に知ることができます。犯人は通常、という名前のメソッドRecreateHandle
を呼び出します(同様の効果を達成するために、特定の場合に自分自身を呼び出すこともできます)。
別の回避策は考えられません。古いオブジェクトと同じハンドルでオブジェクトを再作成するようにWindowsに指示する方法はありません。