【发布时间】:2012-04-18 19:20:04
【问题描述】:
为什么SetWindowLong(myForm.hWnd, GWL_HWNDPARENT, parentHwnd) 挂起?
我可以通过这三个步骤不断地重现这个问题。
- 创建 .NET 表单
- 初始化 WaitWindow COM 对象,在传递 .NET 窗体句柄时调用 COM 对象上的 ShowWindow
- 在 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 线程。我还不确定,但我感觉这与跨线程问题有关。
【问题讨论】:
-
注意:我无法更新代码的 VB6 部分,因为这是现有系统的一部分,并且在此特定条件之前一直“正常”工作。
标签: .net winapi vb6 interop pinvoke