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);
}
} - 多点几次就出现卡死的情况