Click here to Skip to main content
11,704,315 members (51,241 online)
Click here to Skip to main content

VB.NET, VB6 and C# Interprocess communication via Window Messaging

, 16 May 2004 175.5K 4.2K 59
Rate this:
Please Sign up or sign in to vote.
Article outlining methods for communicating between VB6, VB.NET, and C# apps using Window Messaging.

Introduction

There are quite a few articles on inter-process communication for VB6, and quite a few articles for inter-process communication in .NET. But it is an interesting mix using managed and unmanaged environments for inter-process communication. I have finally got it working after some issues with VB6. Smile | :)

Background

My company is currently developing new applications in .NET, but we still have to support our (main company app) legacy VB6 applications. We had started to use COM-interop from VB6 to VB.NET components, but struck some bugs trying to automate applications from each other. Having a look around, I figured that Window Messaging was independent of VB and .NET environments. So then began my search of code samples and explanations of doing this. Some explained VB6 messaging, some explained .NET messaging, but couldn't find any that did both.

Using the code

For an explanation on the VB.NET sub-classing code, refer to this CodeProject article. I have taken the code straight from here and see no point in explaining it again.

VB6: Form interface:

Private Sub Form_Load()
  ....
  'Create custom window and start listening to window messages.
  modMessaging.InitWindowMessaging
End Sub

Private Sub Form_Unload(Cancel As Integer)
  'Tear down custom message handling and pass 
  'back to original message handler i.e this form
  modMessaging.StopWindowMessaging
End Sub

VB6: Messaging

' Function to create custom window and setup Message Listening
Public Function InitWindowMessaging()

  '\\This statement creates the new window
  hWindowHandle = CreateWindowEx(0, "STATIC", VB6_WINDOWTITLE_SERVER, _
    0, 0, 0, 0, 0, 0, 0, App.hInstance, ByVal 0&)

  '\\ This statement sets the message handling to the
  '\\ProcessWindowMessages function defined later.
  ' We also save the address (hOldProc) of
  '\\of the previous MessageHandler so we
  ' can reset on StopWindowMessaging>
  hOldProc = SetWindowLongApi(hWindowHandle,_
     GWL_WNDPROC, AddressOf ProcessWindowMessages)

  WindowMessagingInitialised = True
End Function

'Function to tear down Message Handling 
'and return to original Message Handler
Public Function StopWindowMessaging()
  '\\This statement sets the Message Handling 
  'to be set to the address
  '\\of the previous MessageHandler which 
  'we saved before changing it to ours.
  Call SetWindowLongApi(hWindowHandle, GWL_WNDPROC, hOldProc)
End Function

'Function to find VB.NET window and attempt to send message
Public Function SendMessageToVBNET()
  Dim hwndTarget As Long
  Dim MessageId As Long

  If WindowMessagingInitialised = False Then
    InitWindowMessaging
  End If

  'Get TargetWindow handle from global Window Name
  hwndTarget = VBNET_WindowHandle

  'Get MessageId from API call to RegisterMessage
  MessageId = VB6_TO_DOTNET_MessageId

  'If Window target exists, then PostMessage to target
  If
  hwndTarget <>  0 Then
      Call PostMessage(hwndTarget, MessageId, 0, 0)
  End If
End Function

Function to process messages. If not one of our custom messages,
'then fall through to original Message Handler
Private Function ProcessWindowMessages(ByVal hwnd As Long, _
  ByVal wMsg As Long, _
  ByVal wParam As Long, _
  ByVal lParam As Integer) As Long

  If wMsg = DOTNET_TO_VB6_MessageId Then
    '\\Respond to the custom message here
    MsgBox "window message received from DOTNET environment"
  Else
    '\\Pass the message to the previous 
    'window procedure to handle it
    ProcessWindowMessages = CallWindowProc(hOldProc, _
                             hwnd, wMsg, wParam, lParam)
  End If

End Function

Points of Interest

One thing which I think is quite nice about this implementation is that it creates its own windows with user defined names. So you have global constants defined in VB6 and VB.NET for the window names. You can then rename your application, and the communication won't break.

The RegisterWindowMessage API call provides a system-wide MessageId. Subsequent calls to RegisterWindowMessage will return the same MessageId.

VB6: One thing to note that is vitally important is that you need to disconnect your custom Message Handler before the application closes, otherwise it starts to handle messages in the VB IDE. It was quite hard to track this problem down because it would work nicely when I ran the executable, but once inside the IDE, it would crash VB. Once I started writing debug.print statements in my Message Handler function, all became clear. Somehow, I was not handing message handling responsibilities to the MainForm.

VB.NET: Nothing much to note here. So much easier in .NET than VB. Smile | :)

Links used while developing:

Version 3 now has VB6App2 source code. You can now use Window Messaging:

  • VB6 -> VB.NET
  • VB6 -> C#
  • VB6 -> VB6App2
  • VB6App2 -> VB6
  • VB.NET -> VB6
  • VB.NET -> C#
  • C# -> VB6
  • C# -> VB.NET

History

  1. Initial release to The Code Project
  2. Updated source and demos to include C# project.
  3. Updated source and demos to include VB6 to VB6App2.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author

angus_grant
Web Developer
Australia Australia
Located in sunny Brisbane Australia, was working for three years in Internet company (ASP website and Exchange 5.5 programming mainly), and have moved on to a bankruptcy and insolvency company.

Working on in-house VB6/SQL Server 2000 application, VB.NET/SQL 2000 apps, C#/SQL 2000 app's and company's ASP/SQL 2000 website (blah, ASP is so yucky now I've used ASP.NET).

Personally working on C# / GDI+ RPG game and some other websites soon to be released.

You may also be interested in...

Comments and Discussions

 
QuestionSome VB6 projects that can help Pin
ISpliter3-Mar-14 13:45
memberISpliter3-Mar-14 13:45 
QuestionBug Pin
Member 874123230-May-13 3:19
memberMember 874123230-May-13 3:19 
BugCritical bug in the code: Integer should be Long or VB6 app will crash Pin
Kenneth Choe20-Nov-12 5:37
memberKenneth Choe20-Nov-12 5:37 
GeneralMy vote of 5 Pin
Member 43208444-May-11 16:45
memberMember 43208444-May-11 16:45 
NewsVery Important Note Pin
Member 267168810-Feb-09 23:02
memberMember 267168810-Feb-09 23:02 
GeneralDownload book for Interprocess Communication and Network Pin
AsirTim18-Jun-08 23:17
memberAsirTim18-Jun-08 23:17 
GeneralIn Vista Pin
joemerchant6-Jun-07 3:43
memberjoemerchant6-Jun-07 3:43 
Generalpassing some data along with the windowMessage Pin
theGhost_k820-Jun-06 23:35
membertheGhost_k820-Jun-06 23:35 
GeneralRe: passing some data along with the windowMessage [modified] Pin
minja21-Jun-06 1:07
memberminja21-Jun-06 1:07 
GeneralRe: passing some data along with the windowMessage Pin
theGhost_k821-Jun-06 2:27
membertheGhost_k821-Jun-06 2:27 
GeneralRe: passing some data along with the windowMessage [modified] Pin
minja21-Jun-06 17:46
memberminja21-Jun-06 17:46 
GeneralRe: Gr8 work but.....It's(problem) is different Pin
Kedar V30-Jun-06 19:46
memberKedar V30-Jun-06 19:46 
GeneralRe: Gr8 work but.....It's(problem) is different [modified] Pin
minja30-Jun-06 21:33
memberminja30-Jun-06 21:33 
GeneralPAssing parameters Pin
benchva13-Apr-06 4:59
memberbenchva13-Apr-06 4:59 
GeneralRe: PAssing parameters Pin
minja13-Apr-06 12:05
memberminja13-Apr-06 12:05 
GeneralHWND_BROADCAST Pin
AndrewVos28-Mar-06 22:02
memberAndrewVos28-Mar-06 22:02 
GeneralVB6 to VB6messaging via LAN Pin
Salim Dallal22-Jan-06 21:16
memberSalim Dallal22-Jan-06 21:16 
GeneralRe: VB6 to VB6messaging via LAN Pin
minja23-Jan-06 11:20
memberminja23-Jan-06 11:20 
GeneralRe: VB6 to VB6messaging via LAN Pin
Salim Dallal23-Jan-06 20:07
memberSalim Dallal23-Jan-06 20:07 
QuestionPassing string as messages? Pin
Josef Meile23-May-05 7:44
memberJosef Meile23-May-05 7:44 
AnswerRe: Passing string as messages? Pin
Josef Meile23-May-05 7:58
memberJosef Meile23-May-05 7:58 
GeneralRe: Passing string as messages? Pin
Josef Meile23-May-05 11:37
memberJosef Meile23-May-05 11:37 
GeneralConfused... :) Pin
IcingDeath4-May-05 10:31
sussIcingDeath4-May-05 10:31 
GeneralRe: Confused... :) Pin
IcingDeath4-May-05 12:04
memberIcingDeath4-May-05 12:04 
GeneralRe: Confused... :) Pin
minja4-May-05 15:41
memberminja4-May-05 15:41 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.150819.1 | Last Updated 17 May 2004
Article Copyright 2004 by angus_grant
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid