js调用本地exe程序,并获取exe运行结果
具体运用场景是这样的,在网页上通过调用客户端的设备来实现拍照或录入指纹等这样的操作。本来硬件设备是肯定会提供js脚本驱动的,但由于某些原因,硬件的驱动的二次开发都是用winfrom程序做的,所以就要求在网页中调用exe并获取拍照的结果。 网上介绍的多的方式有两种,一种是修改注册表,然后通过超链接的形式调用,还有一种就是用ActiveXObject,然后只能ie浏览器能用。这两种方式想要获得exe的运行结果都很麻烦。 我现在用的方法是通过exe程序监听本地的端口,然后在网页中像调用API那样去调用exe从而获得返回结果。
以C#为例:
private void LessionHttp(object lineCount){ HttpListener listerner = new HttpListener(); while (true){ try { listerner.AuthenticationSchemes = AuthenticationSchemes.Anonymous;//指定身份验证 Anonymous匿名访问 listerner.Prefixes.Add("http://127.0.0.1:7070/api/GetIdCard/"); listerner.Prefixes.Add("http://127.0.0.1:7070/api/GetImages/"); listerner.Start(); } catch (Exception ex) { ShowLog("服务启动失败...");//这个ShowLog只是显示信息,可以用自己的方法代替 break; } ShowLog("服务器启动成功......."); int minThreadNum; int portThreadNum; int maxThreadNum; ThreadPool.GetMaxThreads(out maxThreadNum, out portThreadNum); ThreadPool.GetMinThreads(out minThreadNum, out portThreadNum); ShowLog(string.Format("最大线程数:{0}", maxThreadNum)); ShowLog(string.Format("最小空闲线程数:{0}", minThreadNum)); ShowLog("\n\n等待客户连接中。。。。"); while (true){ //等待请求连接 //没有请求则GetContext处于阻塞状态 HttpListenerContext ctx = listerner.GetContext(); ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc), ctx); } //listerner.Stop(); } //Console.ReadKey(); }
private void TaskProc(object o){ HttpListenerContext ctx = (HttpListenerContext)o; ctx.Response.StatusCode = 200;//设置返回给客服端http状态代码 //接收Get参数 string type = ctx.Request.QueryString["type"]; string userId = ctx.Request.QueryString["act"]; //string filename = Path.GetFileName(ctx.Request.RawUrl); //接收POST参数 Stream stream = ctx.Request.InputStream; MeWin.mActionType = ctx.Request.RawUrl.Replace("api/","").Replace("/",""); ShowLog("调用设备:" + MeWin.mActionType); StreamReader reader = new StreamReader(stream, Encoding.UTF8); string body = reader.ReadToEnd(); ShowLog("收到POST数据:" + HttpUtility.UrlDecode(body)); string mCapturePoint= HttpUtility.ParseQueryString(body).Get("capturePoint"); string mImageFormat = HttpUtility.ParseQueryString(body).Get("imageFormat"); ShowLog("capturePoint:" + mCapturePoint); ShowLog("imageFormat:" +mImageFormat ); BeginWork();//这里获取到网页端传递的参数后,开始exe的工作 while (!MeWin.isEnd) { }//让这个线程一直在这里等着,等待exe执行完成,exe执行完成后修改MeWin.isEnd的值来通知这个线程继续 MeWin.isEnd = false; //使用Writer输出http响应代码,UTF8格式 using (StreamWriter writer = new StreamWriter(ctx.Response.OutputStream, Encoding.UTF8)) { ShowLog("用户操作完成"); writer.Write(MeWin.Result);//这里就是返回给网页的结果,返回内容是什么,就随你了 MeWin.Result = ""; writer.Close(); ctx.Response.Close(); } }
上面两段代码主要是exe程序的,下面再看看网页中如何调用
function post(URL, PARAMS) { var temp = document.createElement("form"); temp.action = URL; temp.method = "post"; temp.style.display = "none"; for (var x in PARAMS) { var opt = document.createElement("textarea"); opt.name = x; opt.value = PARAMS[x]; // alert(opt.name) temp.appendChild(opt); } document.body.appendChild(temp); temp.submit(); return temp; } function fff() { post('http://127.0.0.1:7070/api/GetIdCard', { imageFormat: '1' }); } 在网页中执行fff函数就可以了