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