• 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("
    
    等待客户连接中。。。。");
    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函数就可以了
  • 相关阅读:
    root用户Linux 环境变量的配置解决(-bash: jps: command not found)有关问题
    Linux Crontab内环境变量与Shell环境变量的关系及解决问题的办法
    RocketMQ os.sh 系统优化(CentOS)
    Spring Boot修改内置Tomcat端口号
    SpringBoot多跨域请求的支持(JSONP)
    [译]Spring Boot 构建一个RESTful Web服务
    delphi怎样把子窗体显示在pagecontrol的tabsheet
    delphi从TRichEdit获得RTF格式文本(PC版本)
    数据类型表(DELPHI、C++)
    对程序进行注释
  • 原文地址:https://www.cnblogs.com/jin-/p/14685628.html
Copyright © 2020-2023  润新知