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");
}
/**
@param args
*/
public static void main(String[] args){
ScanDome scanDome = new ScanDome();
scanDome.initUI();
}
/**
@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;
}
/**
/**
/**
/**
/**
@Override
public void handleEvent(OleEvent arg0) {
System.out.println("arg0:"+arg0);
}
}