我正在 VB6 应用程序和 VB.NET 应用程序之间进行进程间通信,以将控件名称和属性值从 VB6 获取到 .NET 项目中。我使用 hwnd 作为键发送对 VB6 集合中控件的请求,并将我需要的属性作为 CopyDataStructure 中的字符串发送。然后我使用带有 WM_CopyData 和 CopyDataStructure 的 api 函数 SendMessage 将值发送回 VB.NET
从 VB.NET(其中 PropInfo 是 CopyDataStructure ):
SendMessage(p_hwndTargetHandle, WM_COPYDATA, Me.Handle, PropInfo)
由 VB6 接收:
If KeyExists(p_colControls, CStr(lCtlhWnd)) Then
Dim sPropVal As String
Dim lPropValLen As Long
Dim ctlControl As Control
Set ctlControl = p_colControls.Item(CStr(lCtlhWnd))
sPropVal = CallByName(ctlControl, sPropName, VbGet)
lPropValLen = CLng(Len(sPropVal))
sPropVal = StrConv(sPropVal, vbFromUnicode)
Dim PropInfo As cds
Dim j As Long
PropInfo.dwData = lCtlhWnd
PropInfo.cbData = lPropValLen
PropInfo.lpData = StrPtr(sPropVal)
Dim sError As String
sError = Err.LastDllError
j = SendMessage(lMsgDesthWnd, WM_COPYDATA, UserControl.Hwnd, PropInfo)
sError = Err.LastDllError
End If
SendMessage 将消息发送回从 .NET 发送给它的 Me.Handle。
在 .NET 中,我有以下内容:
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
If m.Msg = WM_COPYDATA Then
GetPropValues(m.LParam)
End If
MyBase.WndProc(m)
End Sub
GetPropValues 方法应将指针指向 CopyDataStructure 并转换回具有请求的控件属性值的字符串。但是,我的 .NET WndProc 从未收到该消息。一切都很好,直到 VB6 代码中的 SendMessage 行。请注意sError = Err.LastDllError
SendMessage 前后的行。这是在 SendMessage 之前为 0,之后为 1400,这是一个 InvalidHandle 错误。
我感到困惑的是,在获取控件属性值之前,我使用几乎完全相同的方法来获取控件名称,并且句柄是完全有效的,而且据我所知,.NET 句柄在此过程中不会改变。
有谁知道.NET 句柄的问题是什么?或者是否有其他问题导致 Windows 抛出 InvalidHandle 错误?
编辑:另一条可能相关的信息,.NET 项目是一个 DLL,它继承 NativeWindow 并通过 NativeWindow 的 CreateHandle 方法获取句柄。