Как я могу получить строку MICR со сканера с помощью драйвера TWAIN

Я пишу код С# для извлечения строки MICR из чеков.

Мой сканер Cannon DR-850M поддерживает считыватель MICR.

Он может читать строку MICR в собственной программе сканирования. Но мне нужно сделать свой собственный с помощью TWAIN.

Я могу сканировать изображения в своей программе с драйвером TWAIN. Однако я не смог найти, как получить строку MICR.

Есть ли функция доступа к считывателю MICR сканера в TWAIN? или что-нибудь еще?


Я обнаружил, что данные MICR находятся в «Расширенной информации об изображении». Спасибо за ответ.

и у меня есть немного больше проблемы.

Вот мой код.

// Twain DLL Wrapper
[StructLayout(LayoutKind.Sequential, Pack = 2)]
internal class TwInfo
{                                   // TW_INFO
    public short InfoID;
    public short ItemType;
    public short NumItems;
    public short CondCode;
    public int Item;
}

[StructLayout(LayoutKind.Sequential, Pack = 2)]
internal class TwExtImageInfo
{                                   // TW_EXTIMAGEINFO
    public int NumInfos;
    [MarshalAs(UnmanagedType.Struct, SizeConst = 1)]
    public TwInfo Info;
}

//Application
public void GetExtendedImageInfo()
    {
        TwRC rc;
        TwExtImageInfo exinf = new TwExtImageInfo();

        exinf.NumInfos = 1;
        exinf.Info = new TwInfo();
        exinf.Info.InfoID = (short)TwEI.BARCODETEXT;

        rc = DSexfer(appid, srcds, TwDG.Image, TwDAT.ExtImageInfo, TwMSG.Get, exinf);

        // Here's What I want to know.
        IntPtr itemPtr = new IntPtr(exinf.Info.Item);  
        string str = Marshal.PtrToStringAnsi(itemPtr); // It returns weird value.
    }

// Here's result
exinf.Info.CondCode : 0 (short)
exinf.Info.InfoID   : 4610 (short)
exinf.Info.Item : 36962876 (int)  // what's that?
exinf.Info.ItemType : 12 (short)
exinf.Info.NumItems : 4 (short)
exinf.NumInfos      : 1 (int)

Я получил эти значения от TWAIN.

Но я не знаю, что это за значение exinf.Info.Item

В примере приложения отображаются правильные символы MICR. Но мой собственный возвращает странное значение.

Могу ли я получить некоторую помощь?


person David Pyo    schedule 20.08.2014    source источник
comment
Не помещайте ответ на вопрос и добавляйте решенный к его заголовку. Разместите ответ ниже, в разделе ваш ответ. Затем примите его, нажав зеленую галочку слева.   -  person abatishchev    schedule 25.08.2014
comment
Спасибо! И добро пожаловать в СО.   -  person abatishchev    schedule 27.08.2014


Ответы (1)



РЕШЕНО

Я просто пропустил использование GlobalLock для указателя.

Вот код.

public string GetExtendedImageInfo()
    {
        TwRC rc;
        TwExtImageInfo exinf = new TwExtImageInfo();

        exinf.NumInfos = 1;
        exinf.Info = new TwInfo();
        exinf.Info.InfoID = (short)TwEI.BARCODETEXT;

        rc = DSexfer(appid, srcds, TwDG.Image, TwDAT.ExtImageInfo, TwMSG.Get, exinf);

        StringBuilder strItem = new StringBuilder(255);
        IntPtr itemPtr = new IntPtr(exinf.Info.Item);
        IntPtr dataPtr = GlobalLock(itemPtr);
        string str = Marshal.PtrToStringAnsi(dataPtr);
        GlobalUnlock(itemPtr);
        GlobalFree(itemPtr);

        return str;
    }
person David Pyo    schedule 26.08.2014