Adobe AIR的本机扩展TWAIN图像扫描仪 [英] Adobe AIR Native Extension TWAIN Image Scanner

查看:246
本文介绍了Adobe AIR的本机扩展TWAIN图像扫描仪的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

目前我工作的Adobe AIR本机扩展,它提供了可能性,以简单的使用TWAIN处理图像扫描仪。
我使用 CTwain 班发现 < A HREF =HTTP://www.$c$cproject.com/Articles/296/AC-Wrapper-for-TWAIN相对=nofollow> HTTP://www.$c$cproject.com/Articles/ 296 / AC-包装换TWAIN

当我使用这个类的Windows应用程序文件(.exe),它按预期工作,但在DLL(我需要创建ANE文件),它的崩溃时TWAIN设备的用户界面是收盘价(扫描完成时,或通过点击取消按钮)

我的事情,问题是某处DllMain.cpp文件(可能是消息循环),因为在应用程序启动功能的 APIENTRY _tWinMain 它完美的作品。

code
DllMain.cpp

 的#includestdafx.h中
#包括TwainCpp.h
#包括RESOURCE.H

使用名字空间std;

HWND g_hwnd = NULL;
HINSTANCE g_hInstance = NULL;
BOOL的isValid = FALSE;
BOOL isCreated = FALSE;
CTwain *吐温= NULL;

LRESULT CALLBACK的WndProc(HWND的HWND,未签名的消息,WPARAM wParam参数,LPARAM lParam的)
{
    开关(消息)
    {
        案例WM_CREATE:
            打破;
        案例WM_DESTROY:
            PostQuitMessage(0);
            打破;
    }
    返回给DefWindowProc(HWND,消息的wParam,lParam的);
}

BOOL CreateAppWindow()
{
    WNDCLASS厕所;
    wc.style = 0;
    wc.lpfnWndProc = WndProc的;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = g_hInstance;
    wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    wc.hCursor =使用LoadCursor(NULL,IDC_ARROW);
    wc.hbrBackground =(HBRUSH)(COLOR_APPWORKSPACE + 1);
    wc.lpszMenuName =FRETwainMenu;
    wc.lpszClassName =FRETwainClass;

    如果(的RegisterClass(安培; WC))
    {
        HWND的HWND;
            焦炭标题[50];
            wsprintf(标题,FRETwain:%X,g_hInstance);
            的hWnd = CreateWindow的(FRETwainClass称号,WS_DISABLED,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,HWND_MESSAGE,NULL,g_hInstance,NULL);
            如果(HWND)
            {
                g_hwnd =的hWnd;
                返回TRUE;
            }
            返回FALSE;
    }
    返回FALSE;
}

DWORD WINAPI CreateAppThread()
{
    如果(CreateAppWindow())
    {
        味精味精;
        isCreated = TRUE;
        而(的GetMessage(安培;味精,NULL,0,0)大于0)
        {
            如果(TWAIN!= NULL){
                兼容TWAIN&GT; ProcessMessage的(MSG);
            }
            的TranslateMessage(安培;味精);
            在DispatchMessage(&安培;味精);
        }
        返回TRUE;
    }
    返回FALSE;
}

BOOL WINAPI的DllMain(HINSTANCE的hInstance,DWORD原因,LPVOID lpvReserved)
{
    开关(原因)
    {
         案例DLL_PROCESS_ATTACH:
            g_hInstance =实例句柄;
            手柄螺纹=的CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)CreateAppThread,(LPVOID)NULL,0,NULL);
            打破;
    }
    返回TRUE;
}
 

FRETwain.cpp(背景文件)

 的#include&LT; WINDOWS.H&GT;
#包括FRETwain.h

为extern BOOL的isValid;
为extern BOOL isCreated;
为extern HWND g_hwnd;
为extern CTwain *吐温;

为externC
{
    FREObject AcquireTwain(FREContext CTX,无效* funcData,uint32_t的ARGC,FREObject的argv [])
    {
        FREObject结果;
        uint32_t的RET = 0;
        如果(参考isValid){
            兼容TWAIN&GT;获取(TWCPP_ANYCOUNT);
            RET = 1;
        }
        FRENewObjectFromBool(RET,和放大器;结果);
       返回结果;
    }

    FREObject setDefaultDevice(FREContext CTX,无效* funcData,uint32_t的ARGC,FREObject的argv [])
    {
        FREObject结果;
        uint32_t的RET = 0;
        如果(参考isValid){
            兼容TWAIN&GT; SelectSource();
            RET = 1;
        }
        FRENewObjectFromBool(RET,和放大器;结果);
        返回结果;
    }

    FREObject initTwain(FREContext CTX,无效* funcData,uint32_t的ARGC,FREObject的argv [])
    {
        FREObject结果;
        uint32_t的isTwain = 0;
        如果(!的isValid){
            船儿=新CTwain(g_hwnd,CTX);
            的isValid =兼容TWAIN&GT; IsValidDriver();
        }
        如果(参考isValid)
            isTwain = 1;
        FRENewObjectFromBool(isTwain,和放大器;结果);
        返回结果;
    }

}
 

解决方案

我发现了另一个吐温wraper - C ++版本的 EzTwain - 完美的作品
<一href="http://read.pudn.com/downloads81/source$c$c/graph/texture_mapping/312714/ice/win32/Eztwain.h__.htm"相对=nofollow>头文件,<一个href="http://read.pudn.com/downloads81/source$c$c/graph/texture_mapping/312714/ice/win32/Eztwain.h__.htm"相对=nofollow>源文件

所谓的同一个线程内消息循环

 无效EZTAPI TWAIN_ModalEventLoop(无效)
{
    味精味精;

    而((NSTATE&GT; = 5)及&安培;!hDib&安培;&安培;的GetMessage((LPMSG)及味精,NULL,0,0)){
        如果(TWAIN_MessageHook((LPMSG)及!MSG)){
            的TranslateMessage((LPMSG)及味精);
            在DispatchMessage((LPMSG)及味精);
        }
    } // 而
} // TWAIN_ModalEventLoop
 

不管怎样,谢谢

Currently I am working on Adobe AIR Native extension which gives possibilities to simple manipulate image scanner using TWAIN.
I use CTwain class found at http://www.codeproject.com/Articles/296/A-C-Wrapper-for-TWAIN

When i use this class in Windows Application (.exe) it works as expected, but in dll (which i need to create ane file) it crashes when Twain Device UI is closing (when scan complete or by clicking Cancel button)

I thing the problem is somewhere in DllMain.cpp file (possibly message loop), because in application with starting function APIENTRY _tWinMain it works perfect.

Code
DllMain.cpp

#include "stdafx.h"
#include "TwainCpp.h"
#include "resource.h"

using namespace std;

HWND g_hwnd = NULL;
HINSTANCE g_hInstance = NULL;
BOOL isValid = false;
BOOL isCreated = false;
CTwain *twain = NULL;

LRESULT CALLBACK WndProc(HWND hWnd, unsigned message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        case WM_CREATE:         
            break;
        case WM_DESTROY:            
            PostQuitMessage(0);
            break;
    }   
    return DefWindowProc(hWnd, message, wParam, lParam);
}

BOOL CreateAppWindow()
{
    WNDCLASS  wc;
    wc.style = 0;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = g_hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE + 1);
    wc.lpszMenuName =  "FRETwainMenu";
    wc.lpszClassName = "FRETwainClass";

    if(RegisterClass(&wc))
    {
        HWND hWnd;          
            char title[50];
            wsprintf(title, "FRETwain:%x", g_hInstance);
            hWnd = CreateWindow("FRETwainClass", title, WS_DISABLED,               CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,                      HWND_MESSAGE, NULL, g_hInstance, NULL);
            if(hWnd)
            {       
                g_hwnd = hWnd;                  
                return TRUE;                    
            }               
            return FALSE;       
    }   
    return FALSE;
}

DWORD WINAPI CreateAppThread()
{   
    if(CreateAppWindow())
    {
        MSG msg;
        isCreated = true;
        while(GetMessage(&msg, NULL, 0, 0) > 0)
        {
            if(twain != NULL){              
                twain->ProcessMessage(msg);             
            }   
            TranslateMessage(&msg);
            DispatchMessage(&msg);                      
        }       
        return TRUE;
    }
    return FALSE;
}

BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD reason, LPVOID lpvReserved)
{
    switch(reason)
    {
         case DLL_PROCESS_ATTACH:
            g_hInstance = hInstance;            
            HANDLE thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)CreateAppThread, (LPVOID)NULL, 0, NULL);
            break;
    }        
    return TRUE;
}

FRETwain.cpp (context file)

#include <windows.h>
#include "FRETwain.h"

extern BOOL isValid;
extern BOOL isCreated;
extern HWND g_hwnd;
extern CTwain *twain;

extern "C"
{   
    FREObject AcquireTwain(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
    {   
        FREObject result;
        uint32_t ret = 0;   
        if(isValid){
            twain->Acquire(TWCPP_ANYCOUNT);
            ret = 1;
        }   
        FRENewObjectFromBool(ret, &result);
       return result;
    }

    FREObject setDefaultDevice(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
    {   
        FREObject result;
        uint32_t ret = 0;   
        if(isValid){
            twain->SelectSource();
            ret = 1;
        }
        FRENewObjectFromBool(ret, &result);
        return result;
    }

    FREObject initTwain(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[])
    {       
        FREObject result;
        uint32_t isTwain = 0;   
        if(!isValid){
            twain = new CTwain(g_hwnd, ctx);
            isValid = twain->IsValidDriver();
        }       
        if(isValid)
            isTwain = 1;
        FRENewObjectFromBool(isTwain, &result);
        return result;
    }

}

解决方案

I found another Twain wraper - C++ version of EzTwain - works perfect
header file, source file

message loop called within same thread

void EZTAPI TWAIN_ModalEventLoop(void)  
{  
    MSG msg;  

    while ((nState >= 5) && !hDib && GetMessage((LPMSG)&msg, NULL, 0, 0)) {  
        if (!TWAIN_MessageHook ((LPMSG)&msg)) {  
            TranslateMessage ((LPMSG)&msg);  
            DispatchMessage ((LPMSG)&msg);  
        }  
    } // while  
} // TWAIN_ModalEventLoop 

Thanks anyway

这篇关于Adobe AIR的本机扩展TWAIN图像扫描仪的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆