What kind of message?
If you can use a 32 bit unsigned int to represent the message you can use the return value of the process...
Child...
int main (void)
{ // do a buch of stuff
return MsgVal; }
Parent...
DWORD MsgValue;
// a mess of code...
// launch child with CreateProcess()
GetExitCodeProcess(hProcess,&MsgValue);
There are other methods as well... for example you can use inter-process messaging such as PostThreadMessage() and WM_COPYDATA to send a message from child to parent, provided the childe knows the parent's thread handle which you can also send inter-process to the child... Another option is memory mapped files and semiphore files (child writes file to disk before exiting, parent reads the file after the child returns)...
It really depends on what you are passing back and forth and how big the messages are...