Flex +javascript +Activex FLex 通过Javascript 调用ActiveX 操作硬件问题

我现在遇到这样的问题,公司做一套miss产品也就是我们的收银,仓储管理之类的软件 这个时候会和很多的硬件打交道,例如 pos收银机,打票机,钱箱 ,扫描器等等。 我们界面准备用flex来做, 后台用java (Spring +hibernate) +Blazeds ,现在就是遇到了flex和硬件打交道的问题。因为厂商提供的接口 都是dll 所以我是 通过Activex 封装厂商提供的Dll ,然后javascript 去调用ActiveX,然后flex 调用javascript. 但是在页面 引用 <object id="test"  codeBase="test.CAB#1,0,0,1"  classid="CLSID:E1BAF4EF-D3AA-4526-9A75-3E52CCDE1D2A" ></object>
  ,这个对象的时候, flex 找不到任何信息.  也不报错, 这个activeX 我用html代码测试是没有问题的。 能正确得到dll返回的值。 把代码写在 flex的页面就不行了、  下面我贴出我的代码

首先在 flex 里面,我在index.template.html 里面加入的代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- saved from url=(0014)about:internet -->
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
     <!--
     Smart developers always View Source.
    
     This application was built using Adobe Flex, an open source framework
     for building rich Internet applications that get delivered via the
     Flash Player or to desktops via Adobe AIR.
    
     Learn more about Flex at http://flex.org
     // -->
     <head>
         <title>${title}</title>
         <meta name="google" value="notranslate" />        
         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
         <!-- Include CSS to eliminate any default margins/padding and set the height of the html element and
              the body element to 100%, because Firefox, or any Gecko based browser, interprets percentage as
              the percentage of the height of its parent container, which has to be set explicitly.  Fix for
              Firefox 3.6 focus border issues.  Initially, don't display flashContent div so it won't show
              if JavaScript disabled.
         -->
         <style type="text/css" media="screen">
             html, body  { height:100%; }
             body { margin:0; padding:0; overflow:auto; text-align:center;
                    background-color: ${bgcolor}; }  
             object:focus { outline:none; }
             #flashContent { display:none; }
         </style>
        
         <!-- Enable Browser History by replacing useBrowserHistory tokens with two hyphens -->
         <!-- BEGIN Browser History required section ${useBrowserHistory}>
         <link rel="stylesheet" type="text/css" href="history/history.css" />
         <script type="text/javascript" src="history/history.js"></script>
         <!${useBrowserHistory} END Browser History required section --> 
            
         <script type="text/javascript" src="swfobject.js"></script>
         <script type="text/javascript">
             // For version detection, set to min. required Flash Player version, or 0 (or 0.0.0), for no version detection.
             var swfVersionStr = "${version_major}.${version_minor}.${version_revision}";
             // To use express install, set to playerProductInstall.swf, otherwise the empty string.
             var xiSwfUrlStr = "${expressInstallSwf}";
             var flashvars = {};
             var params = {};
             params.quality = "high";
             params.bgcolor = "${bgcolor}";
             params.allowscriptaccess = "sameDomain";
             params.allowfullscreen = "true";
             var attributes = {};
             attributes.id = "${application}";
             attributes.name = "${application}";
             attributes.align = "middle";
             swfobject.embedSWF(
                 "${swf}.swf",
                 "flashContent",
                 "${width}",
                 "${height}",
                 swfVersionStr,
                 xiSwfUrlStr,
                 flashvars,
                 params,
                 attributes
             );
             // JavaScript enabled so display the flashContent div in case it is not replaced with a swf object.
             swfobject.createCSS("#flashContent", "display:block;text-align:left;");
         </script>
         <script >
         function sayHello(){
        
          alert("你好 伙计!");
         }
        
         </script>
          <script language="javascript">
   function testdll()
   {
            
   // alert("bbb");
   // var btn=document.getElementById("btn").value;
   // alert(btn);
    //var did=document.getElementById("test").value;
   // alert(did);
   //这里导入了我的Activex 打包的cab文件 叫test.CAB  里面的Dll有 个叫GetContent的方法,有两个参数 ,是int类型的, 返回的是 这两个参之和; 我在html代码里面测试了 是没问题的。 能正确返回 值 2;
    var sun = test.GetContent(1,1);
  
    alert(sun);
  
   }
   </script>
        
     </head>
     <body>
  <object id="test"  codeBase="test.CAB#1,0,0,1"  classid="CLSID:E1BAF4EF-D3AA-4526-9A75-3E52CCDE1D2A" ></object>
         <!-- SWFObject's dynamic embed method replaces this alternative HTML content with Flash content when enough
              JavaScript and Flash plug-in support is available. The div is initially hidden so that it doesn't show
              when JavaScript is disabled.
         -->
   <!---->
   <input id="btn" value="点击我" type ="button"  style="display:none"/>
         <div id="flashContent">
             <p>
                 To view this page ensure that Adobe Flash Player version
                 ${version_major}.${version_minor}.${version_revision} or greater is installed.
             </p>
             <script type="text/javascript">
                 var pageHost = ((document.location.protocol == "https:") ? "https://" : "http://");
                 document.write("<a href='http://www.adobe.com/go/getflashplayer'><img src='"
                                 + pageHost + "www.adobe.com/images/shared/download_buttons/get_flash_player.gif' alt='Get Adobe Flash player' /></a>" );
             </script>
         </div>
        
         <noscript>
            
  
             <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="${width}" height="${height}" id="${application}">
                 <param name="movie" value="${swf}.swf" />
                 <param name="quality" value="high" />
                 <param name="bgcolor" value="${bgcolor}" />
                 <param name="allowScriptAccess" value="sameDomain" />
                 <param name="allowFullScreen" value="true" />
                 <!--[if !IE]>-->
                 <object type="application/x-shockwave-flash" data="${swf}.swf" width="${width}" height="${height}">
                     <param name="quality" value="high" />
                     <param name="bgcolor" value="${bgcolor}" />
                     <param name="allowScriptAccess" value="sameDomain" />
                     <param name="allowFullScreen" value="true" />
                 <!--<![endif]-->
                 <!--[if gte IE 6]>-->
                     <p>
                         Either scripts and active content are not permitted to run or Adobe Flash Player version
                         ${version_major}.${version_minor}.${version_revision} or greater is not installed.
                     </p>
                 <!--<![endif]-->
                     <a href="http://www.adobe.com/go/getflashplayer">
                         <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash Player" />
                     </a>
                 <!--[if !IE]>-->
                 </object>
                 <!--<![endif]-->
             </object>
           
         </noscript>    
    </body>
</html>


这里是我的flex 的MXML 代码:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
       xmlns:s="library://ns.adobe.com/flex/spark"
       xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
  <fx:Declarations>
   <!-- 将非可视元素(例如服务、值对象)放在此处 -->
  </fx:Declarations>
  <fx:Script>
   <![CDATA[
   
   public function callJs():void{
     ExternalInterface.call("sayHello");
    
    }
   
   
    public function callJs1():void{
    //这里的 testdll是index.template.html 页面加入的js 函数
     ExternalInterface.call("testdll");
    
    }
   ]]>
  </fx:Script>
  <s:Button id="btn" x="12" y="10" label="FLex 调用 js" click="callJs()">

</s:Button>
  <s:Button id="btn1" x="10" y="77" label="FLex 调用 js  and dll" click="callJs1()"/>
</s:Application>

你可能感兴趣的:(JavaScript,java,Flex,Acticex)