为什么会SetWindowLong(myForm.hWnd, GWL_HWNDPARENT, parentHwnd)
挂?
我可以通过这三个步骤不断地重现这个问题。
- 创建 .NET 表单
- 初始化 WaitWindow COM 对象,在 COM 对象上调用 ShowWindow,同时传递 .NET Forms Handle
- 在 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 表单句柄时挂起。
编辑2
我现在认为这个问题与 SetWindowLong 无关,而是与实际句柄本身有关。我仍在调查,但似乎当我从 .NET 调用 VB6 代码时,它会创建一个 RPC 线程。我还不确定,但我感觉它与跨线程问题有关。