进程间通讯:消息(.net app 与 mfc dll)

进程间通讯:消息(.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);

    }
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;
        }

    }
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);
            }
        }

    }

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();
}


你可能感兴趣的:(进程间通讯:消息(.net app 与 mfc dll))