How do I enumerate resolutions supported via TWAIN

我的梦境 提交于 2019-12-08 00:08:44


I have to enumerate DPI's supported by scanner via TWAIN interface.

// after Acquire is called... 
GetCapability(twCap, ICAP_XRESOLUTION)

if (twCap.ConType == TWON_ENUMERATION) {
   pTW_ENUMERATION en = (pTW_ENUMERATION) GlobalLock(twCap.hContainer);

   for(int i = 0; i < en->NumItems; i++) {
      if (en->ItemType == TWTY_FIX32)  {
    TW_UINT32 res = (TW_UINT32)(en->ItemList[i*4]); 
    // print res... 

That works fine but output sequence is strange:

50 100 150 44 88 176

I know exactly that my scanner supports 300 DPI but this value doesn't returned. What I do wrong here? Why "300" is not returned in sequence though I can set it programmatically?


The code you shown takes just the lower byte of the resolutions, and then converts it to integer (the pointer points to chars, so the line fetch just a char and then converts it to integer).

You must specify that the pointer points to TW_UNIT32 values BEFORE reading the value.

The number 44 for instance, is the lower byte of the number 300 (300 DPI)

The following code should do it:

TW_UINT32 res = ((TW_UINT32*)(en->ItemList))[i];


TW_UINT32 res = *((TW_UINT32*)(en->ItemList + i * 4));