なぜSetWindowLong(myForm.hWnd, GWL_HWNDPARENT, parentHwnd)
ハングするのですか?
これらの 3 つの手順を実行することで、この問題を一貫して再現できます。
- .NET フォームを作成する
- WaitWindow COM オブジェクトを初期化し、COM オブジェクトで ShowWindow を呼び出し、.NET フォーム ハンドルを渡します。
- VB6 で SetWindowLong メソッドを呼び出します
C# Windows アプリケーション (ハング)
private static void Main(string[] args)
{
Form form = new Form();
form.Show();
Interop.WaitWindow waitWindow = new Interop.WaitWindow();
waitWindow.ShowWindow(form.Handle.ToInt32(), Language.RISEnglish);
}
C# コンソール アプリケーション (ハングしない)
private static void Main(string[] args)
{
IntPtr handle = Process.GetCurrentProcess().MainWindowHandle;
Interop.WaitWindow waitWindow = new Interop.WaitWindow();
waitWindow.ShowWindow(handle.ToInt32(), Language.RISEnglish);
}
VB6 コード スニペット
Public Sub ShowWindow(ByVal parentHwnd As Long, ByVal language As Language)
SetWindowLong(myForm.hWnd, GWL_HWNDPARENT, parentHwnd) 'Hangs Here
CenterWindow (parentHwnd)
myForm.ShowRetrieving (language)
myForm.Show (vbModal)
End Sub
本当に助けていただければ幸いです:)
編集
親を変更するために SetWIndowLong を呼び出すべきではないことは理解していますが、.NET フォーム ハンドルが使用されている場合にのみハングする理由を理解しようとしています。
EDIT2
この問題は SetWindowLong に関連しているのではなく、実際のハンドル自体に関連していると思います。まだ調査中ですが、.NET から VB6 コードを呼び出すと、RPC スレッドが作成されるようです。まだよくわかりませんが、クロススレッドの問題と関係があると感じています。