OLE调用扫描仪 得不到控件ActiveX

wkwanglei 2017-04-16 11:00:08
OLE调用的关键代码:

package com.resoft.scan;

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.OleFrame;
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 wanglei
*
*/
public class ScanDome extends SelectionAdapter {

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);

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");
}

/**
* 多点几次就出现卡死的情况<br>
* 看日志 扫描的文件已经写入 文件件<br>
* 日志到达 启动扫描仪就卡住了, <br>
* 之后应该是结束扫描,但是一直没有返回值。<br>
*
* 测试要求 安装中软OCX控件,安装虚拟扫描仪<br>
* @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 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);
}
}


点击扫描时经常出现得不到控件返回信息。消息队列一直在等待。

初步怀疑扫描控件扫描后 有一个提示扫描结束的提示框,可能是这个提示框不知道提示那里去了。 找不到了。不点击确定控件一直在等到信息。因为明显能看到页面又一次闪烁,但是在web IE8上使用没有问题,可能是这个弹出框在java awt 上丢失导致的。

请问那个大神能给解决思路? 谢谢
...全文
148 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

51,396

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧