首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#偏题,知识面广的朋友帮忙进来看一下!

2013-12-02 
C#难题,知识面广的朋友帮忙进来看一下!!说明:是这样的,我想做一个窗体程序,并且是一直运行于内存中的,这个

C#难题,知识面广的朋友帮忙进来看一下!!
说明:
是这样的,我想做一个窗体程序,并且是一直运行于内存中的,这个窗体程序提供文件转换服务(JPG转TIF)。
但这个窗体自身并不包含业务,而业务逻辑可能在其他N个进程中处理。这些进程处理到需要转换文件的时候,就把文件路径发送到这个窗体程序中,这个窗体程序转换好后,通知发送过来的进程(“已经转换好了”)。然后这个进程继续处理它自己的业务逻辑。(重点提示:这样的业务进程可能有N多条)

-------------------------------------------
问题是:我这个窗体应该用什么技术来提供与其它进程进行通讯呢??
-------------------------------------------
我的思考:我原先想用TCP/IP端口通讯,但觉得在本机运行的程序还要用到网络通讯的方式,有点不合理。然后我想到内存共享,但又不好管理,要写大量正则。接着我想到windows消息队列组件,但依赖于组件,又怕不稳定,而且内部运行机制不透明(并且还要安装)。然后我又想到web service,但它却不能提供UI界面。然后我又想到窗体间的回调函数(目前觉得最好是这个)。  大神啊,帮顶一下吧
[解决办法]
没弄过这种的,帮顶一个
[解决办法]
进程间通讯,其实用SendMessage就可以实现,刚找了一下以前做的东西,正好是进程间通讯的,主要是主程序调用校验程序,校验程序返回校验结果。


using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace SendMsg
{
    #region 结构体定义
    [StructLayout(LayoutKind.Sequential)]
    public struct COPYDATASTRUCT
    {
        public int dwData;
        public int cbData;
        public int lpData;
    }

    //定义要传递的Struct
    [StructLayout(LayoutKind.Sequential)]
    struct SendMsgInfo
    {
        /// <summary>
        /// 参数(单号)
        /// </summary>
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
        public string AccessionNum;
        /// <summary>
        /// 参数(原文)
        /// </summary>
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5000)]
        public string ReportTxt;
        /// <summary>
        /// 参数(Ris用户)
        /// </summary>
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
        public string RisUid;
        /// <summary>
        /// 调用方法名
        /// </summary>
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
        public string FunctionNum;
        /// <summary>
        /// 端口
        /// </summary>
        public int Handle;
        /// <summary>
        /// 返回值
        /// </summary>
        public bool Result;
        /// <summary>
        /// Err信息
        /// </summary>
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 200)]
        public string ResultMsg;
    }
    #endregion

    class CaSendMsg
    {
        Process pro;
        const int WM_COPYDATA = 0x004A;

        private string _winFrmName = @"校验程序";
        private string _path = @"校验.exe";


        private int _interval = 500;
        private int _maxTimes = 5;

        /// <summary>
        /// 窗体名称
        /// </summary>
        public string WinFrmName
        {
            set { _winFrmName = value; }
            get { return _winFrmName; }
        }

        /// <summary>
        /// 程序路径
        /// </summary>
        public string Path
        {
            set { _path = value; }
            get { return _path; }
        }

        /// <summary>
        /// 等待轮序频率 秒/次
        /// </summary>
        public int Interval
        {
            set { _interval = value; }
            get { return _interval; }
        }

        /// <summary>
        /// 上限次数
        /// </summary>
        public int MaxTimes
        {
            set { _maxTimes = value; }
            get { return _maxTimes; }
        }

        [DllImport("user32", EntryPoint = "SendMessageA")]
        public static extern int SendMessage(int hWnd, int wMsg, int wParam, ref COPYDATASTRUCT lParam);
        
        [DllImport("User32.dll", EntryPoint = "FindWindow")]
        public static extern int FindWindow(string lpClassName, string
            lpWindowName);        

        /// <summary>
        /// ca校验
        /// </summary>
        /// <param name="h"></param>
        /// <returns></returns>
        public bool CACheck(SendMsgInfo h)
        {
            int hWnd = GetWinFrmHwnd();
            if (hWnd <= 0)
                return false;
            return CACheck(h, hWnd);
        }

        /// <summary>
        /// 获取程序句柄
        /// </summary>
        /// <returns></returns>
        private int GetWinFrmHwnd()
        {
            int hWnd = FindWindow(null, _winFrmName);
            if (hWnd <= 0)
            {
                hWnd = StartNewPro(_path);
            }
            return hWnd;
        }

        /// <summary>
        /// 开启新的校验进程


        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
        private int StartNewPro(string path)
        {
            try
            {
                pro = new Process();
                pro.StartInfo.FileName = path;
                pro.Start();
                return pro.MainWindowHandle.ToInt32();
            }
            catch
            {
                return 0;
            }
        }

        public bool CACheck(SendMsgInfo info, int hWnd)
        {
            try
            {
                int size = Marshal.SizeOf(typeof(SendMsgInfo));
                byte[] Bytes = new byte[size];
                //根据定义的尺寸分配内存块
                GCHandle GC = GCHandle.Alloc(Bytes, GCHandleType.Pinned);
                IntPtr ptr1 = GC.AddrOfPinnedObject();
                //获得Struct对应的IntPtr
                Marshal.StructureToPtr(info, ptr1, false);
                COPYDATASTRUCT SendData = new COPYDATASTRUCT();
                SendData.lpData = ptr1.ToInt32();
                SendData.cbData = size;
                
                if (hWnd > 0)
                {
                    SendMessage(hWnd, WM_COPYDATA, 0, ref (SendData));
                }

                return true;
            }
            catch
            {
                return false;
            }
        }

        public bool getCaResult(System.Windows.Forms.Message m)
        {
            COPYDATASTRUCT RecvData = (COPYDATASTRUCT)m.GetLParam(typeof(COPYDATASTRUCT));
            SendMsgInfo info = (SendMsgInfo)Marshal.PtrToStructure((IntPtr)RecvData.lpData, typeof(SendMsgInfo));
            //h.ResultMsg;
            return info.Result;
        }

    }
}



调用:

//接收消息
protected override void DefWndProc(ref System.Windows.Forms.Message m)
        {
            switch (m.Msg)
            {
                case WM_COPYDATA:


                    COPYDATASTRUCT RecvData = (COPYDATASTRUCT)m.GetLParam(typeof(COPYDATASTRUCT));
                    SendMsgInfo h = (SendMsgInfo)Marshal.PtrToStructure((IntPtr)RecvData.lpData, typeof(SendMsgInfo));
                   
            //返回校验结果
            SendMsgInfo returnInfo = new SendMsgInfo();
            returnInfo.Handle = h.Handle;
            returnInfo.AccessionNum = h.AccessionNum;
            returnInfo.Result = result;
            returnInfo.ResultMsg = "";
            CaSendMsg c = new CaSendMsg();
            c.CACheck(returnInfo, returnInfo.Handle);
                default:
                    base.DefWndProc(ref m);
                    break;
            }
        }

热点排行