进程间通讯:消息(.net app 与 mfc dll)
http://www.cppblog.com/erran/archive/2012/05/19/175360.html
C#消息处理函数引用
/// <summary>
/// <para> 版 权 : Copyright (c) 20010-2011 </para>
/// <para> 项 目 : xxxxx/RD/xxxx </para>
/// <para> 文件名称 : </para>
/// <para> 创 建 人 : lizhi </para>
/// <para> 创建日期 : 2010-11-22 </para>
/// <remarks> 备 注 :
/// [email protected]
/// </remarks>
/// </summary>
///
public class Win32Message
{
/// <summary>
/// 消息
/// </summary>
public const int WM_COPYDATA = 0x004A ;
/// <summary>
/// WM_COPYDATA消息结构体
/// </summary>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct COPYDATASTRUCT
{
/// <summary>
/// 用户定义数据
/// </summary>
public IntPtr dwData;
/// <summary>
/// 数据大小
/// </summary>
public int cbData;
/// <summary>
/// 指向数据的指针
/// </summary>
public IntPtr lpData;
}
/// <summary>
/// 注册消息用
/// 在win7中,如果以管理员方式运行,需要加入该语句,注册WM_COPYDATA消息,避免过滤掉该消息。
/// </summary>
/// <param name="msg"></param>
/// <param name="flags"></param>
/// <returns></returns>
[DllImport( " user32 " )]
public static extern bool ChangeWindowMessageFilter( int msg, int flags);
/// <summary>
/// 发送WM_COPYDATA消息
/// </summary>
/// <param name="hWnd"></param>
/// <param name="msg"></param>
/// <param name="wParam"></param>
/// <param name="lParam"></param>
/// <returns></returns>
[DllImport( " User32.dll " , EntryPoint = " SendMessage " )]
public static extern int SendMessage( int hWnd, int msg, IntPtr wParam, IntPtr lParam);
/// <summary>
/// 发送WM_COPYDATA消息
/// </summary>
/// <param name="hWnd"></param>
/// <param name="msg"></param>
/// <param name="wParam"></param>
/// <param name="lParam"></param>
/// <returns></returns>
[DllImport( " user32 " )]
public static extern bool PostMessage( int hWnd, int msg, IntPtr wParam, IntPtr lParam);
/// <summary>
/// 查找句柄
/// </summary>
/// <param name="lpClassName"></param>
/// <param name="lpWindowName"></param>
/// <returns></returns>
[DllImport( " User32.dll " , EntryPoint = " FindWindow " )]
public static extern IntPtr FindWindow( string lpClassName, string lpWindowName);
/// <summary>
/// 查找句柄
/// </summary>
/// <param name="hwndParent"></param>
/// <param name="hwndChildAfter"></param>
/// <param name="lpszClass"></param>
/// <param name="lpszWindow"></param>
/// <returns></returns>
[DllImport( " user32.dll " , EntryPoint = " FindWindowEx " )]
public static extern IntPtr FindWindowEx(IntPtr hwndParent,IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
}
/// <para> 版 权 : Copyright (c) 20010-2011 </para>
/// <para> 项 目 : xxxxx/RD/xxxx </para>
/// <para> 文件名称 : </para>
/// <para> 创 建 人 : lizhi </para>
/// <para> 创建日期 : 2010-11-22 </para>
/// <remarks> 备 注 :
/// [email protected]
/// </remarks>
/// </summary>
///
public class Win32Message
{
/// <summary>
/// 消息
/// </summary>
public const int WM_COPYDATA = 0x004A ;
/// <summary>
/// WM_COPYDATA消息结构体
/// </summary>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct COPYDATASTRUCT
{
/// <summary>
/// 用户定义数据
/// </summary>
public IntPtr dwData;
/// <summary>
/// 数据大小
/// </summary>
public int cbData;
/// <summary>
/// 指向数据的指针
/// </summary>
public IntPtr lpData;
}
/// <summary>
/// 注册消息用
/// 在win7中,如果以管理员方式运行,需要加入该语句,注册WM_COPYDATA消息,避免过滤掉该消息。
/// </summary>
/// <param name="msg"></param>
/// <param name="flags"></param>
/// <returns></returns>
[DllImport( " user32 " )]
public static extern bool ChangeWindowMessageFilter( int msg, int flags);
/// <summary>
/// 发送WM_COPYDATA消息
/// </summary>
/// <param name="hWnd"></param>
/// <param name="msg"></param>
/// <param name="wParam"></param>
/// <param name="lParam"></param>
/// <returns></returns>
[DllImport( " User32.dll " , EntryPoint = " SendMessage " )]
public static extern int SendMessage( int hWnd, int msg, IntPtr wParam, IntPtr lParam);
/// <summary>
/// 发送WM_COPYDATA消息
/// </summary>
/// <param name="hWnd"></param>
/// <param name="msg"></param>
/// <param name="wParam"></param>
/// <param name="lParam"></param>
/// <returns></returns>
[DllImport( " user32 " )]
public static extern bool PostMessage( int hWnd, int msg, IntPtr wParam, IntPtr lParam);
/// <summary>
/// 查找句柄
/// </summary>
/// <param name="lpClassName"></param>
/// <param name="lpWindowName"></param>
/// <returns></returns>
[DllImport( " User32.dll " , EntryPoint = " FindWindow " )]
public static extern IntPtr FindWindow( string lpClassName, string lpWindowName);
/// <summary>
/// 查找句柄
/// </summary>
/// <param name="hwndParent"></param>
/// <param name="hwndChildAfter"></param>
/// <param name="lpszClass"></param>
/// <param name="lpszWindow"></param>
/// <returns></returns>
[DllImport( " user32.dll " , EntryPoint = " FindWindowEx " )]
public static extern IntPtr FindWindowEx(IntPtr hwndParent,IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
}
C# 消息解析函数
/// <summary>
/// <para> 版 权 : Copyright (c) 20010-2011 </para>
/// <para> 项 目 : xxxxx/RD/xxxx </para>
/// <para> 文件名称 : </para>
/// <para> 创 建 人 : lizhi </para>
/// <para> 创建日期 : 2010-11-22 </para>
/// <remarks> 备 注 :
/// [email protected]
/// </remarks>
/// </summary>
///
/// <summary>
/// 脚本测试类
/// </summary>
public class TestingMessage
{
/// <summary>
/// 消息 开始
/// </summary>
public const int WM_USER_START = 0x04DD ;
/// <summary>
/// 消息 继续
/// </summary>
public const int WM_USER_CONTINUE = 0x05F8 ;
/// <summary>
/// 消息 停止
/// </summary>
public const int WM_USER_ABORT = 0x06F9 ;
/// <summary>
/// 最后的消息数据
/// </summary>
public string testingScript = null ;
/// <summary>
/// 初始化
/// </summary>
public bool tetsingEnable = false ;
/// <summary>
/// 初始化
/// </summary>
/// <returns></returns>
public bool Initiate()
{
Win32Message.ChangeWindowMessageFilter(Win32Message.WM_COPYDATA, 1 );
tetsingEnable = true ;
return true ;
}
/// <summary>
/// 解析消息
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
public bool DoMessage( ref System.Windows.Forms.Message msg)
{
bool tested = false ;
switch (msg.Msg)
{
case Win32Message.WM_COPYDATA :
DoMsgCopyData( ref msg);
tested = true ;
break ;
case WM_USER_START :
DoMsgStart( ref msg);
tested = true ;
break ;
case WM_USER_CONTINUE :
DoMsgContinue( ref msg);
tested = true ;
break ;
case WM_USER_ABORT :
DoMsgAbort( ref msg);
tested = true ;
break ;
default :
break ;
}
return tested;
}
/// <summary>
/// 处理拷贝数据
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
public bool DoMsgCopyData( ref System.Windows.Forms.Message msg)
{
bool tested = false ;
if (tetsingEnable)
{
try
{
Win32Message.COPYDATASTRUCT mystr = new Win32Message.COPYDATASTRUCT();
Type mytype = mystr.GetType();
mystr = (Win32Message.COPYDATASTRUCT)msg.GetLParam(mytype);
Byte[] scriptbytes = new Byte[mystr.cbData];
Marshal.Copy(mystr.lpData, scriptbytes, 0 , mystr.cbData);
System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
testingScript = utf8.GetString(scriptbytes);
System.Windows.Forms.MessageBox.Show(testingScript);
tested = true ;
}
catch
{
tested = false ;
}
}
return tested;
}
/// <summary>
/// 开始
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
public bool DoMsgStart( ref System.Windows.Forms.Message msg)
{
bool tested = false ;
if (tetsingEnable)
{
try
{
if (testingScript != null )
{
tested = XXXX.Parser.TestingParser.Instance.TestRunning(testingScript);
System.Windows.Forms.MessageBox.Show( " SERVER DoMsgStart " );
}
}
catch
{
tested = false ;
}
}
return tested;
}
/// <summary>
/// 继续
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
public bool DoMsgContinue( ref System.Windows.Forms.Message msg)
{
bool tested = false ;
if (tetsingEnable)
{
try
{
if (testingScript != null )
{
tested = XXXX .Parser.TestingParser.Instance.TestContinue();
System.Windows.Forms.MessageBox.Show( " SERVER DoMsgContinue " );
}
}
catch
{
tested = false ;
}
}
return tested;
}
/// <summary>
/// 继续
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
public bool DoMsgAbort( ref System.Windows.Forms.Message msg)
{
bool tested = false ;
if (tetsingEnable)
{
try
{
if (testingScript != null )
{
tested = XXXX .Parser.TestingParser.Instance.TestAbort();
testingScript = null ;
System.Windows.Forms.MessageBox.Show( " SERVER DoMsgAbort " );
}
}
catch
{
tested = false ;
}
}
return tested;
}
}
/// <para> 版 权 : Copyright (c) 20010-2011 </para>
/// <para> 项 目 : xxxxx/RD/xxxx </para>
/// <para> 文件名称 : </para>
/// <para> 创 建 人 : lizhi </para>
/// <para> 创建日期 : 2010-11-22 </para>
/// <remarks> 备 注 :
/// [email protected]
/// </remarks>
/// </summary>
///
/// <summary>
/// 脚本测试类
/// </summary>
public class TestingMessage
{
/// <summary>
/// 消息 开始
/// </summary>
public const int WM_USER_START = 0x04DD ;
/// <summary>
/// 消息 继续
/// </summary>
public const int WM_USER_CONTINUE = 0x05F8 ;
/// <summary>
/// 消息 停止
/// </summary>
public const int WM_USER_ABORT = 0x06F9 ;
/// <summary>
/// 最后的消息数据
/// </summary>
public string testingScript = null ;
/// <summary>
/// 初始化
/// </summary>
public bool tetsingEnable = false ;
/// <summary>
/// 初始化
/// </summary>
/// <returns></returns>
public bool Initiate()
{
Win32Message.ChangeWindowMessageFilter(Win32Message.WM_COPYDATA, 1 );
tetsingEnable = true ;
return true ;
}
/// <summary>
/// 解析消息
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
public bool DoMessage( ref System.Windows.Forms.Message msg)
{
bool tested = false ;
switch (msg.Msg)
{
case Win32Message.WM_COPYDATA :
DoMsgCopyData( ref msg);
tested = true ;
break ;
case WM_USER_START :
DoMsgStart( ref msg);
tested = true ;
break ;
case WM_USER_CONTINUE :
DoMsgContinue( ref msg);
tested = true ;
break ;
case WM_USER_ABORT :
DoMsgAbort( ref msg);
tested = true ;
break ;
default :
break ;
}
return tested;
}
/// <summary>
/// 处理拷贝数据
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
public bool DoMsgCopyData( ref System.Windows.Forms.Message msg)
{
bool tested = false ;
if (tetsingEnable)
{
try
{
Win32Message.COPYDATASTRUCT mystr = new Win32Message.COPYDATASTRUCT();
Type mytype = mystr.GetType();
mystr = (Win32Message.COPYDATASTRUCT)msg.GetLParam(mytype);
Byte[] scriptbytes = new Byte[mystr.cbData];
Marshal.Copy(mystr.lpData, scriptbytes, 0 , mystr.cbData);
System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
testingScript = utf8.GetString(scriptbytes);
System.Windows.Forms.MessageBox.Show(testingScript);
tested = true ;
}
catch
{
tested = false ;
}
}
return tested;
}
/// <summary>
/// 开始
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
public bool DoMsgStart( ref System.Windows.Forms.Message msg)
{
bool tested = false ;
if (tetsingEnable)
{
try
{
if (testingScript != null )
{
tested = XXXX.Parser.TestingParser.Instance.TestRunning(testingScript);
System.Windows.Forms.MessageBox.Show( " SERVER DoMsgStart " );
}
}
catch
{
tested = false ;
}
}
return tested;
}
/// <summary>
/// 继续
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
public bool DoMsgContinue( ref System.Windows.Forms.Message msg)
{
bool tested = false ;
if (tetsingEnable)
{
try
{
if (testingScript != null )
{
tested = XXXX .Parser.TestingParser.Instance.TestContinue();
System.Windows.Forms.MessageBox.Show( " SERVER DoMsgContinue " );
}
}
catch
{
tested = false ;
}
}
return tested;
}
/// <summary>
/// 继续
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
public bool DoMsgAbort( ref System.Windows.Forms.Message msg)
{
bool tested = false ;
if (tetsingEnable)
{
try
{
if (testingScript != null )
{
tested = XXXX .Parser.TestingParser.Instance.TestAbort();
testingScript = null ;
System.Windows.Forms.MessageBox.Show( " SERVER DoMsgAbort " );
}
}
catch
{
tested = false ;
}
}
return tested;
}
}
C# 窗体
/// <summary>
/// <para> 版 权 : Copyright (c) 20010-2011 </para>
/// <para> 项 目 : xxxxx/RD/xxxx </para>
/// <para> 文件名称 : </para>
/// <para> 创 建 人 : lizhi </para>
/// <para> 创建日期 : 2010-11-22 </para>
/// <remarks> 备 注 :
/// [email protected]
/// </remarks>
/// </summary>
///
public partial class FormMain : Form
{
/// <summary>
/// 消息解析
/// </summary>
private TestingMessage testingMessage = null ;
/// <summary>
/// 构造
/// </summary>
public FormMain()
{
testingMessage = new TestingMessage();
InitializeComponent();
}
/// <summary>
/// 加载
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void FormMain_Load( object sender, EventArgs e)
{
testingMessage.Initiate();
}
/// <summary>
/// 关闭
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void FormMain_FormClosed( object sender, FormClosedEventArgs e)
{
System.Windows.Forms.Message msg = new Message();
testingMessage.DoMsgAbort( ref msg);
testingMessage = null ;
}
/// <summary>
/// 消息处理函数
/// </summary>
/// <param name="m"></param>
protected override void DefWndProc( ref System.Windows.Forms.Message msg)
{
if ( ! testingMessage.DoMessage( ref msg))
{
base .DefWndProc( ref msg);
}
}
}
/// <para> 版 权 : Copyright (c) 20010-2011 </para>
/// <para> 项 目 : xxxxx/RD/xxxx </para>
/// <para> 文件名称 : </para>
/// <para> 创 建 人 : lizhi </para>
/// <para> 创建日期 : 2010-11-22 </para>
/// <remarks> 备 注 :
/// [email protected]
/// </remarks>
/// </summary>
///
public partial class FormMain : Form
{
/// <summary>
/// 消息解析
/// </summary>
private TestingMessage testingMessage = null ;
/// <summary>
/// 构造
/// </summary>
public FormMain()
{
testingMessage = new TestingMessage();
InitializeComponent();
}
/// <summary>
/// 加载
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void FormMain_Load( object sender, EventArgs e)
{
testingMessage.Initiate();
}
/// <summary>
/// 关闭
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void FormMain_FormClosed( object sender, FormClosedEventArgs e)
{
System.Windows.Forms.Message msg = new Message();
testingMessage.DoMsgAbort( ref msg);
testingMessage = null ;
}
/// <summary>
/// 消息处理函数
/// </summary>
/// <param name="m"></param>
protected override void DefWndProc( ref System.Windows.Forms.Message msg)
{
if ( ! testingMessage.DoMessage( ref msg))
{
base .DefWndProc( ref msg);
}
}
}
MFC DLL 消息发送端
CTestingMessage::CTestingMessage( void )
{
initializeSuccessed = false ;
processAppHandle = NULL;
processAppName = _T( " \\\\XXXX\\XXXX.XXXXX.XXXX.exe " );
processWindowName = _T( "XXXXXXXX " );
}
CTestingMessage:: ~ CTestingMessage( void )
{
}
CTestingMessage * CTestingMessage::Instance()
{
static CTestingMessage * ins = NULL;
if (ins == NULL)
{
ins = new CTestingMessage();
}
return ins;
}
bool CTestingMessage::InitTesting( void )
{
bool bFlag = false ;
processMutex.Lock();
try
{
::ChangeWindowMessageFilter(WM_COPYDATA, 1 );
/*
TCHAR exepath[MAX_PATH];
memset(exepath, 0, MAX_PATH);
GetModuleFileName(NULL, exepath, MAX_PATH);
CString strdir = exepath;
strdir = strdir.Left(strdir.ReverseFind('\\'));
CString szAppName = strdir;
szAppName += processAppName;
MessageBox(NULL, szAppName, _T(""), 0);
PROCESS_INFORMATION pi;
bFlag = ::CreateProcess(szAppName,
NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, NULL, &pi);
if (bFlag)
{
processAppHandle = pi.hProcess;
} */
bFlag = true ;
}
catch (CException * e)
{
bFlag = false ;
processAppHandle = NULL;
}
initializeSuccessed = bFlag;
processMutex.Unlock();
return bFlag;
}
bool CTestingMessage::ExitTesting( void )
{
bool bFlag = false ;
processMutex.Lock();
initializeSuccessed = false ;
if (processAppHandle != NULL)
{
::TerminateProcess(processAppHandle, 0 );
CloseHandle(processAppHandle);
processAppHandle = NULL;
}
bFlag = true ;
processMutex.Unlock();
return bFlag;
}
bool CTestingMessage::StartTesting(LPCSTR pScript)
{
bool bFlag = false ;
processMutex.Lock();
if (initializeSuccessed)
{
HWND hWnd = ::FindWindow(NULL, processWindowName);
if (hWnd != NULL)
{
// 发送数据
COPYDATASTRUCT cd;
cd.cbData = strlen(pScript);
cd.dwData = WM_COPYDATA;
cd.lpData = ( void * )pScript;
::SendMessage(hWnd, WM_COPYDATA, 0 , (LPARAM)( & cd));
// 发送命令
::SendMessage(hWnd, WM_USER_START, 0 , 0 );
bFlag = true ;
}
}
processMutex.Unlock();
return bFlag;
}
bool CTestingMessage::AbortTesting()
{
bool bFlag = false ;
processMutex.Lock();
if (initializeSuccessed)
{
HWND hWnd = ::FindWindow(NULL, processWindowName);
if (hWnd != NULL)
{
::SendMessage(hWnd, WM_USER_ABORT, 0 , 0 );
bFlag = true ;
}
}
processMutex.Unlock();
return bFlag;
}
void CTestingMessage::ContinueTesting()
{
bool bFlag = false ;
processMutex.Lock();
if (initializeSuccessed)
{
HWND hWnd = ::FindWindow(NULL, processWindowName);
if (hWnd != NULL)
{
::SendMessage(hWnd, WM_USER_CONTINUE, 0 , 0 );
bFlag = true ;
}
}
processMutex.Unlock();
}