分享

关于JNI实现TWAIN接口

 ctbtcol 2015-01-07
我要实现JAVA的扫描仪调用
我通过C++调用TWAIN接口,生成DLL
通过JAVA的JNI调用DLL
=======================================
目前EnableDS后TWAIN对话框出来了,但通过消息循环,无法得到扫描和关闭事件消息
=======================================
JAVA部分的实现:
程序启动时列出所有可用设备
按钮事件选择并OPENDS那个设备
另一个按钮事件ENABLEDS那个设备
--------------------------------------------------
C++部分代码:

JNIEXPORT void JNICALL Java_main_Main_enableDS
  (JNIEnv *$env, jclass $cls, jboolean $showUI, jboolean $model){
    JAVA_CATCH_BEGIN("启动设备")
    g_twainTools.EnableDS($showUI == JNI_TRUE, $model == JNI_TRUE);
    MSG msg;
    TW_UINT16 dsMsg = 0xFF;
    while(GetMessage(&msg, NULL, 0, 0)) {
        if (!g_twainTools.TWAIN_MessageLoop(&msg, dsMsg)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    JAVA_CATCH_END
}
void CoTwain::EnableDS(bool $showUI, bool $model) throw(CoTwainException) {
    CATCH_BEGIN("启动设备")
    // 状态检查
    TW_INT32 validStatus[] = {
        STAT_SOURCE_OPENED
    };
    CHECKSTATUS(validStatus, actionName);

    TW_USERINTERFACE twUI;
    twUI.ShowUI = $showUI;
    twUI.ModalUI = $model;
    twUI.hParent = m_hMainWnd;

    TW_UINT16 rc = m_lpfnDsmEntry(&m_AppId, &m_SourceID, DG_CONTROL, DAT_USERINTERFACE,
            MSG_ENABLEDS, &twUI);
    if (rc == TWRC_SUCCESS) {
        _status = STAT_SOURCE_ENABLED;
    } else {
        DSMEXCEPTION(actionName, rc);
    }
    CATCH_END
}
bool CoTwain::TWAIN_MessageLoop(const PMSG $pMsg, TW_UINT16 &$dsMsg) throw(CoTwainException) {
    CATCH_BEGIN("消息循环")
    if (0 == m_SourceID.Id) return false;
    TW_EVENT twEvent;
    twEvent.pEvent = $pMsg;
    twEvent.TWMessage = MSG_NULL;

    TW_UINT16 rc = m_lpfnDsmEntry(&m_AppId, &m_SourceID
            , DG_CONTROL, DAT_EVENT, MSG_PROCESSEVENT
            , &twEvent);
    $dsMsg = twEvent.TWMessage;
    // 是设备事件时
    if (TWRC_NOTDSEVENT != rc) {
        if (MSG_XFERREADY == twEvent.TWMessage) {
            _status = STAT_SOURCE_READY;
            return true;
        } else if (MSG_CLOSEDSREQ == twEvent.TWMessage) {
            _status = STAT_SOURCE_ENABLED;
            return true;
        }
        return true;
    }
    return false;
    CATCH_END
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约