Click here to Skip to main content
15,867,756 members
Articles / Programming Languages / C#
Article

Use WM_COPYDATA to send data to/from C++ and C# Windows processes

Rate me:
Please Sign up or sign in to vote.
4.56/5 (30 votes)
26 Oct 20032 min read 135.8K   7.5K   51   19
Use WM_COPYDATA to send data to/from C++ and C# Windows processes

Introduction

This demo demonstrates how to send / receive WM_COPYDATA messages between a collection of C++ and C# programs.

Why use WM_COPYDATA?

Traditionally WM_COPYDATA was used to send a limited amount of data between processes on the same machine. It is still desirable to interoperate this way even with the rise of .NET. .NET Remoting is out of the scope of this demo. This demo is intended for people like myself that are dealing with legacy environments.

The demo consists of four programs and one DLL. Two programs are written in C++ (MS Version 5.0) and two are written in C# (using .NET 2003). A C++ exe and C# exe will send the structure shown below to a C++ and C# receiving program.

struct sTagData
{//this is the structure that will be sent (copied) by the WM_COPYDATA
private:
    char szTag[ciMaxTag];
    char szData[ciMaxData];
}

The DLL was written in VC 5.0 and it wraps the WM_COPYDATA message.

Additionally, the DLL provides a uniform way of :-

  1. Protecting the receiving application from third party processes that may be unwise enough to HWND_BROADCAST the WM_COPYMESSAGE.
  2. Allows incoming messages to be limited to specific senders either by handle or sender id.
  3. Optional use a crude bitwise encryption to discourage hackers from spying on messages.

Unzip using the full paths to your C drive. The result should be the shown directory structure.

  • C:\WmCpyDta
  • C:\WMCpyDat\Build - the folder where all build output is placed for all projects.
  • C:\WMCpyDat\From_C - a C++ program that sends the structure
  • C:\WMCpyDat\TO_C - a C++ program that receives the structure
  • C:\WMCpyDat\From_C_Sharp – a C# program that sends the structure
  • C:\WMCpyDat\\TO_C_Sharp - a C# program that receives the structure.

To use the demo, open folder build and click on all 4 executables. Click on the send buttons in the FROM apps and the message will appear in the TO apps. Both FROM programs are document to show how to use the DLL’s interface. Likewise, both TO programs are documented in their WindowProc()’s to show how to receive the data.

Platforms supported

These programs have only been tested on Windows XP.

Other facts

Philip McGahan is the sole creator of this demo. No part of it has been plagiarized from other sources. Any party may use all or part of this demo with out credit or reference to Philip McGahan.

Lastly, it is only fair to tell my reader that I am very new at C#. I did try to use C# to build the DLL. But beyond never getting the data to come across with out junk at the end of the string. I was not comfortable with having to setup unsafe blocks. The whole thing just seemed clumsy. When or if I get better at C#, I will revisit this issue.

History

  • 10/23/2003 - First published

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


Written By
Web Developer
United States United States
Just a good guy.

Comments and Discussions

 
QuestionVery Nice Sample: but need wmcpydta_d.lib Pin
Member 1348378724-Oct-17 18:27
Member 1348378724-Oct-17 18:27 
AnswerRe: Very Nice Sample: but need wmcpydta_d.lib Pin
Rick York24-Oct-17 19:17
mveRick York24-Oct-17 19:17 
QuestionCan this be used for Communication Between Windows Service and Console Application Pin
Peter Liu27-Sep-11 16:53
Peter Liu27-Sep-11 16:53 
QuestionNeed More! Pin
rahul_raut4-May-11 23:26
rahul_raut4-May-11 23:26 
GeneralMy vote of 5 Pin
rahul_raut4-May-11 23:18
rahul_raut4-May-11 23:18 
GeneralI have an error Pin
hjhk45646520-Apr-09 21:40
hjhk45646520-Apr-09 21:40 
AnswerRe: I have an error Pin
shanekelly15-Mar-11 10:54
shanekelly15-Mar-11 10:54 
GeneralHelp please! Pin
rufj5-May-08 20:04
rufj5-May-08 20:04 
GeneralRe: Help please! Pin
mcgahanfl6-May-08 2:37
mcgahanfl6-May-08 2:37 
GeneralRe: Help please! Pin
rufj6-May-08 23:03
rufj6-May-08 23:03 
AnswerRe: Help please! Pin
Alexey Plotnikov21-Nov-08 4:08
Alexey Plotnikov21-Nov-08 4:08 
Generalproblem Pin
modream5-Nov-07 0:03
modream5-Nov-07 0:03 
Generalexcellent article Pin
deepikakethireddy31-Oct-07 0:00
deepikakethireddy31-Oct-07 0:00 
GeneralVery nice Pin
Shato16-Apr-07 10:40
Shato16-Apr-07 10:40 
GeneralGreat job Pin
J.Q.C.13-Aug-06 11:13
J.Q.C.13-Aug-06 11:13 
GeneralExcelent Pin
ellolazo13-Jun-06 4:43
ellolazo13-Jun-06 4:43 
GeneralGood job Pin
sbozcan26-May-06 1:54
sbozcan26-May-06 1:54 
Thanks. This is exactly what I was looking for. Smile | :)
GeneralGreat Job! Pin
ciaoroma18-Feb-05 5:33
ciaoroma18-Feb-05 5:33 
GeneralAwesome. Just what I needed ! However ... Pin
Dan Clark4-Nov-04 6:21
Dan Clark4-Nov-04 6:21 

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

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