wkwanglei 2017-04-29 05:18 采纳率: 0%
浏览 1026
已结题

java OCX 调用扫描仪,得不到扫描仪结束消息,造成死循环,IE OCX 扫描正常

IE OCX 调用扫描仪正常。
现在开发了一版 java 使用 OleControlSite调用OCX 扫描的。
代码不是很复杂,但是现在有一个问题。

经常出现假死,监测OCX的源码发现 扫描时
获取系统消息 GetMessage 得不到扫描仪回复的 扫描下一张,或者扫描结束的消息。
造成死循环。

但是一样的代码 在IE OCX控件扫描 就不会出现这个问题。

有大神给分析下原因吗?

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.ole.win32.OLE;
import org.eclipse.swt.ole.win32.OleAutomation;
import org.eclipse.swt.ole.win32.OleControlSite;
import org.eclipse.swt.ole.win32.OleEvent;
import org.eclipse.swt.ole.win32.OleFrame;
import org.eclipse.swt.ole.win32.OleListener;
import org.eclipse.swt.ole.win32.Variant;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;

import com.resoft.scan.constant.ScanConstant;

/**

  • @author wanglei02
    *
    */
    public class ScanDome extends SelectionAdapter implements OleListener {

    private OleAutomation oleAutomation ;

    public void initUI(){
    final Display display = new Display();
    Shell shell = new Shell(display,SWT. APPLICATION_MODAL|SWT.CLOSE);
    shell.setText("扫描");
    // Your code goes here (widget creation, set result, etc).
    shell.setSize(700, 600);

    Menu menu = new Menu(shell, SWT.BAR);
    MenuItem scanItem = new MenuItem(menu,SWT.PUSH);
    scanItem.setText("扫描");
    scanItem.addSelectionListener(this);     
    shell.setMenuBar(menu);
    
    OleFrame oleFrame = new OleFrame(shell, SWT.NONE);
    oleFrame.setSize(700, 500);
    oleFrame.setVisible(true);
    
    OleControlSite clientSite = new OleControlSite(oleFrame, SWT.NONE, ScanConstant.OCX_ID);
    clientSite.setSize(700, 500);
    clientSite.setRedraw(true);   
    clientSite.doVerb(OLE.OLEIVERB_SHOW);
    clientSite.pack();
    
    oleAutomation = new OleAutomation(clientSite);
    this.ShowUI(false);
    this.imageScrollactivated();
    this.SelectSource(false);
    this.getIDs("FireScanImage");
    shell.setLayout(new FillLayout());
    //打开界面
    shell.open();
    shell.layout();
    //开始扫描
    while (!shell.isDisposed()) {
        if (!display.readAndDispatch()) {
            display.sleep();
        }
    }
    
    System.exit(0);
    

    }

    @Override

    public void widgetSelected(final SelectionEvent e) {

    this.startScan("8729c703d72b4e9a8e871621a57f2676;1111;1111");
    }

    /**

    • 多点几次就出现卡死的情况
    • 看日志 扫描的文件已经写入 文件件
    • 日志到达 启动扫描仪就卡住了,
    • 之后应该是结束扫描,但是一直没有返回值。
    • 测试要求 安装中软OCX控件,安装虚拟扫描仪
    • @param args
      */
      public static void main(String[] args){

      ScanDome scanDome = new ScanDome();
      scanDome.initUI();

    }
    /**

    • 执行 命令
    • @param auto
    • @param methodName
    • @param arg
    • @return
      */
      private Variant execute(OleAutomation auto, String methodName, Object arg[]) {
      int[] ids = auto.getIDsOfNames(new String[] { methodName });
      System.out.print("method:" + methodName + " " + "arg:" + arg + " id:" + ids[0]);
      Variant rtnv;
      Variant[] rgvarg = null;
      if (null == arg) {
      rtnv = auto.invoke(ids[0]);
      } else {
      rgvarg = new Variant[arg.length];
      for (int i = 0; i < arg.length; i++) {
      if (arg[i] instanceof Boolean) {
      rgvarg[i] = new Variant((Boolean) arg[i]);
      } else if (arg[i] instanceof Integer) {
      rgvarg[i] = new Variant((Integer) arg[i]);
      } else {
      rgvarg[i] = new Variant((String) arg[i]);
      }

      }
      rtnv = auto.invoke(ids[0], rgvarg);
      

      }
      System.out.println(" rtnv:" + rtnv);
      return rtnv;
      }

    /**

    • @param 开始扫描 */ public void getIDs(String names) { int[] ids = oleAutomation.getIDsOfNames(new String[] {names}); System.out.println("ids:"+ids); }

    /**

    • @param 开始扫描 */ public void startScan(String requestId) { execute(oleAutomation, ScanConstant.START_SCAN, new String[] { requestId+";111;111;" }); }

    /**

    • @param 显示扫描仪设置 */ public void ShowUI(boolean isShowUI) { execute(oleAutomation, ScanConstant.SHOW_UI, new Object[] {isShowUI}); }

    /**

    • @param 选择扫描源 */ public void SelectSource(boolean isSelectSource) { execute(oleAutomation, ScanConstant.SELECT_SOURCE, new Object[] {isSelectSource}); }

    /**

    • @param 激活控件
    • @return */ public void imageScrollactivated() { execute(oleAutomation, ScanConstant.IMG_SCROLL_ACTIVATED,null); }

    @Override
    public void handleEvent(OleEvent arg0) {

    System.out.println("arg0:"+arg0);
    

    }
    }


  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 Error in check.length("fill") : 'gpar'成分'fill'的长度不能为零
    • ¥15 python:excel数据写入多个对应word文档
    • ¥60 全一数分解素因子和素数循环节位数
    • ¥15 ffmpeg如何安装到虚拟环境
    • ¥188 寻找能做王者评分提取的
    • ¥15 matlab用simulink求解一个二阶微分方程,要求截图
    • ¥30 乘子法解约束最优化问题的matlab代码文件,最好有matlab代码文件
    • ¥15 写论文,需要数据支撑
    • ¥15 identifier of an instance of 类 was altered from xx to xx错误
    • ¥100 反编译微信小游戏求指导