1

我正在 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.LastDllErrorSendMessage 前后的行。这是在 SendMessage 之前为 0,之后为 1400,这是一个 InvalidHandle 错误。

我感到困惑的是,在获取控件属性值之前,我使用几乎完全相同的方法来获取控件名称,并且句柄是完全有效的,而且据我所知,.NET 句柄在此过程中不会改变。

有谁知道.NET 句柄的问题是什么?或者是否有其他问题导致 Windows 抛出 InvalidHandle 错误?

编辑:另一条可能相关的信息,.NET 项目是一个 DLL,它继承 NativeWindow 并通过 NativeWindow 的 CreateHandle 方法获取句柄。

4

0 回答 0