Answer:
////////////////////////////////////////////////////////////////////////
// //
// Delphi Scanner Support Framework //
// //
// Copyright (C) 1999 by Uli Tessel //
// //
////////////////////////////////////////////////////////////////////////
// //
// Modified and rewritten as a Delphi component by: //
// //
// M. de Haan //
// //
// June 2002 //
// //
////////////////////////////////////////////////////////////////////////
Unit
TWAIN;
Interface
Uses
SysUtils, // Exceptions
Forms, // TMessageEvent
Windows, // HMODULE
Graphics, // TBitmap
IniFiles, // Inifile
Controls, // TCursor
Classes; // Class
Const
// Messages
MSG_GET = $0001; // Get one or more values
MSG_GETCURRENT = $0002; // Get current value
MSG_GETDEFAULT = $0003; // Get default (e.g. power up) value
MSG_GETFIRST = $0004; // Get first of a series of items,
// e.g. Data Sources
MSG_GETNEXT = $0005; // Iterate through a series of items
MSG_SET = $0006; // Set one or more values
MSG_RESET = $0007; // Set current value to default value
MSG_QUERYSUPPORT = $0008; // Get supported operations on the
// capacities
// Messages used with DAT_NULL
// ---------------------------
MSG_XFERREADY = $0101; // The data source has data ready
MSG_CLOSEDSREQ = $0102; // Request for the application to close
// the Data Source
MSG_CLOSEDSOK = $0103; // Tell the application to save the
// state
MSG_DEVICEEVENT = $0104; // Some event has taken place
// Messages used with a pointer to a DAT_STATUS structure
// ------------------------------------------------------
MSG_CHECKSTATUS = $0201; // Get status information
// Messages used with a pointer to DAT_PARENT data
// -----------------------------------------------
MSG_OPENDSM = $0301; // Open the Data Source Manager
MSG_CLOSEDSM = $0302; // Close the Data Source Manager
// Messages used with a pointer to a DAT_IDENTITY structure
// --------------------------------------------------------
MSG_OPENDS = $0401; // Open a Data Source
MSG_CLOSEDS = $0402; // Close a Data Source
MSG_USERSELECT = $0403; // Put up a dialog of all Data Sources
// The user can select a Data Source
// Messages used with a pointer to a DAT_USERINTERFACE structure
// -------------------------------------------------------------
MSG_DISABLEDS = $0501; // Disable data transfer in the Data
// Source
MSG_ENABLEDS = $0502; // Enable data transfer in the Data
// Source
MSG_ENABLEDSUIONLY = $0503; // Enable for saving Data Source state
// only
// Messages used with a pointer to a DAT_EVENT structure
// -----------------------------------------------------
MSG_PROCESSEVENT = $0601;
// Messages used with a pointer to a DAT_PENDINGXFERS structure
// ------------------------------------------------------------
MSG_ENDXFER = $0701;
MSG_STOPFEEDER = $0702;
// Messages used with a pointer to a DAT_FILESYSTEM structure
// ----------------------------------------------------------
MSG_CHANGEDIRECTORY = $0801;
MSG_CREATEDIRECTORY = $0802;
MSG_DELETE = $0803;
MSG_FORMATMEDIA = $0804;
MSG_GETCLOSE = $0805;
MSG_GETFIRSTFILE = $0806;
MSG_GETINFO = $0807;
MSG_GETNEXTFILE = $0808;
MSG_RENAME = $0809;
MSG_COPY = $080A;
MSG_AUTOMATICCAPTUREDIRECTORY = $080B;
// Messages used with a pointer to a DAT_PASSTHRU structure
// --------------------------------------------------------
MSG_PASSTHRU = $0901;
Const
DG_CONTROL = $0001; // data pertaining to control
DG_IMAGE = $0002; // data pertaining to raster images
Const
// Data Argument Types for the DG_CONTROL Data Group.
DAT_CAPABILITY = $0001; // TW_CAPABILITY
DAT_EVENT = $0002; // TW_EVENT
DAT_IDENTITY = $0003; // TW_IDENTITY
DAT_PARENT = $0004; // TW_HANDLE,
// application win handle in Windows
DAT_PENDINGXFERS = $0005; // TW_PENDINGXFERS
DAT_SETUPMEMXFER = $0006; // TW_SETUPMEMXFER
DAT_SETUPFILEXFER = $0007; // TW_SETUPFILEXFER
DAT_STATUS = $0008; // TW_STATUS
DAT_USERINTERFACE = $0009; // TW_USERINTERFACE
DAT_XFERGROUP = $000A; // TW_UINT32
DAT_IMAGEMEMXFER = $0103; // TW_IMAGEMEMXFER
DAT_IMAGENATIVEXFER = $0104; // TW_UINT32, loword is hDIB, PICHandle
DAT_IMAGEFILEXFER = $0105; // Null data
Const
// Condition Codes: Application gets these by doing DG_CONTROL
// DAT_STATUS MSG_GET.
TWCC_CUSTOMBASE = $8000;
TWCC_SUCCESS = 00; // It worked!
TWCC_BUMMER = 01; // Failure due to unknown causes
TWCC_LOWMEMORY = 02; // Not enough memory to perform operation
TWCC_NODS = 03; // No Data Source
TWCC_MAXCONNECTIONS = 04; // Data Source is connected to maximum
// number of possible applications
TWCC_OPERATIONERROR = 05; // Data Source or Data Source Manager
// reported error, application
// shouldn't report an error
TWCC_BADCAP = 06; // Unknown capability
TWCC_BADPROTOCOL = 09; // Unrecognized MSG DG DAT combination
TWCC_BADVALUE = 10; // Data parameter out of range
TWCC_SEQERROR = 11; // DG DAT MSG out of expected sequence
TWCC_BADDEST = 12; // Unknown destination Application /
// Source in DSM_Entry
TWCC_CAPUNSUPPORTED = 13; // Capability not supported by source
TWCC_CAPBADOPERATION = 14; // Operation not supported by
// capability
TWCC_CAPSEQERROR = 15; // Capability has dependancy on other
// capability
TWCC_DENIED = 16; // File System operation is denied
// (file is protected)
TWCC_FILEEXISTS = 17; // Operation failed because file
// already exists
TWCC_FILENOTFOUND = 18; // File not found
TWCC_NOTEMPTY = 19; // Operation failed because directory
// is not empty
TWCC_PAPERJAM = 20; // The feeder is jammed
TWCC_PAPERDOUBLEFEED = 21; // The feeder detected multiple pages
TWCC_FILEWRITEERROR = 22; // Error writing the file (meant for
// things like disk full conditions)
TWCC_CHECKDEVICEONLINE = 23; // The device went offline prior to or
// during this operation
Const
// Flags used in TW_MEMORY structure
TWMF_APPOWNS = $01;
TWMF_DSMOWNS = $02;
TWMF_DSOWNS = $04;
TWMF_POINTER = $08;
TWMF_HANDLE = $10;
Const
// Flags for country, which seems to be equal to their telephone
// number
TWCY_AFGHANISTAN = 1001;
TWCY_ALGERIA = 0213;
TWCY_AMERICANSAMOA = 0684;
TWCY_ANDORRA = 0033;
TWCY_ANGOLA = 1002;
TWCY_ANGUILLA = 8090;
TWCY_ANTIGUA = 8091;
TWCY_ARGENTINA = 0054;
TWCY_ARUBA = 0297;
TWCY_ASCENSIONI = 0247;
TWCY_AUSTRALIA = 0061;
TWCY_AUSTRIA = 0043;
TWCY_BAHAMAS = 8092;
TWCY_BAHRAIN = 0973;
TWCY_BANGLADESH = 0880;
TWCY_BARBADOS = 8093;
TWCY_BELGIUM = 0032;
TWCY_BELIZE = 0501;
TWCY_BENIN = 0229;
TWCY_BERMUDA = 8094;
TWCY_BHUTAN = 1003;
TWCY_BOLIVIA = 0591;
TWCY_BOTSWANA = 0267;
TWCY_BRITAIN = 0006;
TWCY_BRITVIRGINIS = 8095;
TWCY_BRAZIL = 0055;
TWCY_BRUNEI = 0673;
TWCY_BULGARIA = 0359;
TWCY_BURKINAFASO = 1004;
TWCY_BURMA = 1005;
TWCY_BURUNDI = 1006;
TWCY_CAMAROON = 0237;
TWCY_CANADA = 0002;
TWCY_CAPEVERDEIS = 0238;
TWCY_CAYMANIS = 8096;
TWCY_CENTRALAFREP = 1007;
TWCY_CHAD = 1008;
TWCY_CHILE = 0056;
TWCY_CHINA = 0086;
TWCY_CHRISTMASIS = 1009;
TWCY_COCOSIS = 1009;
TWCY_COLOMBIA = 0057;
TWCY_COMOROS = 1010;
TWCY_CONGO = 1011;
TWCY_COOKIS = 1012;
TWCY_COSTARICA = 0506;
TWCY_CUBA = 0005;
TWCY_CYPRUS = 0357;
TWCY_CZECHOSLOVAKIA = 0042;
TWCY_DENMARK = 0045;
TWCY_DJIBOUTI = 1013;
TWCY_DOMINICA = 8097;
TWCY_DOMINCANREP = 8098;
TWCY_EASTERIS = 1014;
TWCY_ECUADOR = 0593;
TWCY_EGYPT = 0020;
TWCY_ELSALVADOR = 0503;
TWCY_EQGUINEA = 1015;
TWCY_ETHIOPIA = 0251;
TWCY_FALKLANDIS = 1016;
TWCY_FAEROEIS = 0298;
TWCY_FIJIISLANDS = 0679;
TWCY_FINLAND = 0358;
TWCY_FRANCE = 0033;
TWCY_FRANTILLES = 0596;
TWCY_FRGUIANA = 0594;
TWCY_FRPOLYNEISA = 0689;
TWCY_FUTANAIS = 1043;
TWCY_GABON = 0241;
TWCY_GAMBIA = 0220;
TWCY_GERMANY = 0049;
TWCY_GHANA = 0233;
TWCY_GIBRALTER = 0350;
TWCY_GREECE = 0030;
TWCY_GREENLAND = 0299;
TWCY_GRENADA = 8099;
TWCY_GRENEDINES = 8015;
TWCY_GUADELOUPE = 0590;
TWCY_GUAM = 0671;
TWCY_GUANTANAMOBAY = 5399;
TWCY_GUATEMALA = 0502;
TWCY_GUINEA = 0224;
TWCY_GUINEABISSAU = 1017;
TWCY_GUYANA = 0592;
TWCY_HAITI = 0509;
TWCY_HONDURAS = 0504;
TWCY_HONGKONG = 0852;
TWCY_HUNGARY = 0036;
TWCY_ICELAND = 0354;
TWCY_INDIA = 0091;
TWCY_INDONESIA = 0062;
TWCY_IRAN = 0098;
TWCY_IRAQ = 0964;
TWCY_IRELAND = 0353;
TWCY_ISRAEL = 0972;
TWCY_ITALY = 0039;
TWCY_IVORYCOAST = 0225;
TWCY_JAMAICA = 8010;
TWCY_JAPAN = 0081;
TWCY_JORDAN = 0962;
TWCY_KENYA = 0254;
TWCY_KIRIBATI = 1018;
TWCY_KOREA = 0082;
TWCY_KUWAIT = 0965;
TWCY_LAOS = 1019;
TWCY_LEBANON = 1020;
TWCY_LIBERIA = 0231;
TWCY_LIBYA = 0218;
TWCY_LIECHTENSTEIN = 0041;
TWCY_LUXENBOURG = 0352;
TWCY_MACAO = 0853;
TWCY_MADAGASCAR = 1021;
TWCY_MALAWI = 0265;
TWCY_MALAYSIA = 0060;
TWCY_MALDIVES = 0960;
TWCY_MALI = 1022;
TWCY_MALTA = 0356;
TWCY_MARSHALLIS = 0692;
TWCY_MAURITANIA = 1023;
TWCY_MAURITIUS = 0230;
TWCY_MEXICO = 0003;
TWCY_MICRONESIA = 0691;
TWCY_MIQUELON = 0508;
TWCY_MONACO = 0033;
TWCY_MONGOLIA = 1024;
TWCY_MONTSERRAT = 8011;
TWCY_MOROCCO = 0212;
TWCY_MOZAMBIQUE = 1025;
TWCY_NAMIBIA = 0264;
TWCY_NAURU = 1026;
TWCY_NEPAL = 0977;
TWCY_NETHERLANDS = 0031;
TWCY_NETHANTILLES = 0599;
TWCY_NEVIS = 8012;
TWCY_NEWCALEDONIA = 0687;
TWCY_NEWZEALAND = 0064;
TWCY_NICARAGUA = 0505;
TWCY_NIGER = 0227;
TWCY_NIGERIA = 0234;
TWCY_NIUE = 1027;
TWCY_NORFOLKI = 1028;
TWCY_NORWAY = 0047;
TWCY_OMAN = 0968;
TWCY_PAKISTAN = 0092;
TWCY_PALAU = 1029;
TWCY_PANAMA = 0507;
TWCY_PARAGUAY = 0595;
TWCY_PERU = 0051;
TWCY_PHILLIPPINES = 0063;
TWCY_PITCAIRNIS = 1030;
TWCY_PNEWGUINEA = 0675;
TWCY_POLAND = 0048;
TWCY_PORTUGAL = 0351;
TWCY_QATAR = 0974;
TWCY_REUNIONI = 1031;
TWCY_ROMANIA = 0040;
TWCY_RWANDA = 0250;
TWCY_SAIPAN = 0670;
TWCY_SANMARINO = 0039;
TWCY_SAOTOME = 1033;
TWCY_SAUDIARABIA = 0966;
TWCY_SENEGAL = 0221;
TWCY_SEYCHELLESIS = 1034;
TWCY_SIERRALEONE = 1035;
TWCY_SINGAPORE = 0065;
TWCY_SOLOMONIS = 1036;
TWCY_SOMALI = 1037;
TWCY_SOUTHAFRICA = 0027;
TWCY_SPAIN = 0034;
TWCY_SRILANKA = 0094;
TWCY_STHELENA = 1032;
TWCY_STKITTS = 8013;
TWCY_STLUCIA = 8014;
TWCY_STPIERRE = 0508;
TWCY_STVINCENT = 8015;
TWCY_SUDAN = 1038;
TWCY_SURINAME = 0597;
TWCY_SWAZILAND = 0268;
TWCY_SWEDEN = 0046;
TWCY_SWITZERLAND = 0041;
TWCY_SYRIA = 1039;
TWCY_TAIWAN = 0886;
TWCY_TANZANIA = 0255;
TWCY_THAILAND = 0066;
TWCY_TOBAGO = 8016;
TWCY_TOGO = 0228;
TWCY_TONGAIS = 0676;
TWCY_TRINIDAD = 8016;
TWCY_TUNISIA = 0216;
TWCY_TURKEY = 0090;
TWCY_TURKSCAICOS = 8017;
TWCY_TUVALU = 1040;
TWCY_UGANDA = 0256;
TWCY_USSR = 0007;
TWCY_UAEMIRATES = 0971;
TWCY_UNITEDKINGDOM = 0044;
TWCY_USA = 0001;
TWCY_URUGUAY = 0598;
TWCY_VANUATU = 1041;
TWCY_VATICANCITY = 0039;
TWCY_VENEZUELA = 0058;
TWCY_WAKE = 1042;
TWCY_WALLISIS = 1043;
TWCY_WESTERNSAHARA = 1044;
TWCY_WESTERNSAMOA = 1045;
TWCY_YEMEN = 1046;
TWCY_YUGOSLAVIA = 0038;
TWCY_ZAIRE = 0243;
TWCY_ZAMBIA = 0260;
TWCY_ZIMBABWE = 0263;
TWCY_ALBANIA = 0355;
TWCY_ARMENIA = 0374;
TWCY_AZERBAIJAN = 0994;
TWCY_BELARUS = 0375;
TWCY_BOSNIAHERZGO = 0387;
TWCY_CAMBODIA = 0855;
TWCY_CROATIA = 0385;
TWCY_CZECHREPUBLIC = 0420;
TWCY_DIEGOGARCIA = 0246;
TWCY_ERITREA = 0291;
TWCY_ESTONIA = 0372;
TWCY_GEORGIA = 0995;
TWCY_LATVIA = 0371;
TWCY_LESOTHO = 0266;
TWCY_LITHUANIA = 0370;
TWCY_MACEDONIA = 0389;
TWCY_MAYOTTEIS = 0269;
TWCY_MOLDOVA = 0373;
TWCY_MYANMAR = 0095;
TWCY_NORTHKOREA = 0850;
TWCY_PUERTORICO = 0787;
TWCY_RUSSIA = 0007;
TWCY_SERBIA = 0381;
TWCY_SLOVAKIA = 0421;
TWCY_SLOVENIA = 0386;
TWCY_SOUTHKOREA = 0082;
TWCY_UKRAINE = 0380;
TWCY_USVIRGINIS = 0340;
TWCY_VIETNAM = 0084;
Const
// Flags for languages
TWLG_DAN = 000; // Danish
TWLG_DUT = 001; // Dutch
TWLG_ENG = 002; // English
TWLG_FCF = 003; // French Canadian
TWLG_FIN = 004; // Finnish
TWLG_FRN = 005; // French
TWLG_GER = 006; // German
TWLG_ICE = 007; // Icelandic
TWLG_ITN = 008; // Italian
TWLG_NOR = 009; // Norwegian
TWLG_POR = 010; // Portuguese
TWLG_SPA = 011; // Spannish
TWLG_SWE = 012; // Swedish
TWLG_USA = 013;
TWLG_AFRIKAANS = 014;
TWLG_ALBANIA = 015;
TWLG_ARABIC = 016;
TWLG_ARABIC_ALGERIA = 017;
TWLG_ARABIC_BAHRAIN = 018;
TWLG_ARABIC_EGYPT = 019;
TWLG_ARABIC_IRAQ = 020;
TWLG_ARABIC_JORDAN = 021;
TWLG_ARABIC_KUWAIT = 022;
TWLG_ARABIC_LEBANON = 023;
TWLG_ARABIC_LIBYA = 024;
TWLG_ARABIC_MOROCCO = 025;
TWLG_ARABIC_OMAN = 026;
TWLG_ARABIC_QATAR = 027;
TWLG_ARABIC_SAUDIARABIA = 028;
TWLG_ARABIC_SYRIA = 029;
TWLG_ARABIC_TUNISIA = 030;
TWLG_ARABIC_UAE = 031; // United Arabic Emirates
TWLG_ARABIC_YEMEN = 032;
TWLG_BASQUE = 033;
TWLG_BYELORUSSIAN = 034;
TWLG_BULGARIAN = 035;
TWLG_CATALAN = 036;
TWLG_CHINESE = 037;
TWLG_CHINESE_HONGKONG = 038;
TWLG_CHINESE_PRC = 039; // People's Republic of China
TWLG_CHINESE_SINGAPORE = 040;
TWLG_CHINESE_SIMPLIFIED = 041;
TWLG_CHINESE_TAIWAN = 042;
TWLG_CHINESE_TRADITIONAL = 043;
TWLG_CROATIA = 044;
TWLG_CZECH = 045;
TWLG_DANISH = TWLG_DAN;
TWLG_DUTCH = TWLG_DUT;
TWLG_DUTCH_BELGIAN = 046;
TWLG_ENGLISH = TWLG_ENG;
TWLG_ENGLISH_AUSTRALIAN = 047;
TWLG_ENGLISH_CANADIAN = 048;
TWLG_ENGLISH_IRELAND = 049;
TWLG_ENGLISH_NEWZEALAND = 050;
TWLG_ENGLISH_SOUTHAFRICA = 051;
TWLG_ENGLISH_UK = 052;
TWLG_ENGLISH_USA = TWLG_USA;
TWLG_ESTONIAN = 053;
TWLG_FAEROESE = 054;
TWLG_FARSI = 055;
TWLG_FINNISH = TWLG_FIN;
TWLG_FRENCH = TWLG_FRN;
TWLG_FRENCH_BELGIAN = 056;
TWLG_FRENCH_CANADIAN = TWLG_FCF;
TWLG_FRENCH_LUXEMBOURG = 057;
TWLG_FRENCH_SWISS = 058;
TWLG_GERMAN = TWLG_GER;
TWLG_GERMAN_AUSTRIAN = 059;
TWLG_GERMAN_LUXEMBOURG = 060;
TWLG_GERMAN_LIECHTENSTEIN = 061;
TWLG_GERMAN_SWISS = 062;
TWLG_GREEK = 063;
TWLG_HEBREW = 064;
TWLG_HUNGARIAN = 065;
TWLG_ICELANDIC = TWLG_ICE;
TWLG_INDONESIAN = 066;
TWLG_ITALIAN = TWLG_ITN;
TWLG_ITALIAN_SWISS = 067;
TWLG_JAPANESE = 068;
TWLG_KOREAN = 069;
TWLG_KOREAN_JOHAB = 070;
TWLG_LATVIAN = 071;
TWLG_LITHUANIAN = 072;
TWLG_NORWEGIAN = TWLG_NOR;
TWLG_NORWEGIAN_BOKMAL = 073;
TWLG_NORWEGIAN_NYNORSK = 074;
TWLG_POLISH = 075;
TWLG_PORTUGUESE = TWLG_POR;
TWLG_PORTUGUESE_BRAZIL = 076;
TWLG_ROMANIAN = 077;
TWLG_RUSSIAN = 078;
TWLG_SERBIAN_LATIN = 079;
TWLG_SLOVAK = 080;
TWLG_SLOVENIAN = 081;
TWLG_SPANISH = TWLG_SPA;
TWLG_SPANISH_MEXICAN = 082;
TWLG_SPANISH_MODERN = 083;
TWLG_SWEDISH = TWLG_SWE;
TWLG_THAI = 084;
TWLG_TURKISH = 085;
TWLG_UKRANIAN = 086;
TWLG_ASSAMESE = 087;
TWLG_BENGALI = 088;
TWLG_BIHARI = 089;
TWLG_BODO = 090;
TWLG_DOGRI = 091;
TWLG_GUJARATI = 092;
TWLG_HARYANVI = 093;
TWLG_HINDI = 094;
TWLG_KANNADA = 095;
TWLG_KASHMIRI = 096;
TWLG_MALAYALAM = 097;
TWLG_MARATHI = 098;
TWLG_MARWARI = 099;
TWLG_MEGHALAYAN = 100;
TWLG_MIZO = 101;
TWLG_NAGA = 102;
TWLG_ORISSI = 103;
TWLG_PUNJABI = 104;
TWLG_PUSHTU = 105;
TWLG_SERBIAN_CYRILLIC = 106;
TWLG_SIKKIMI = 107;
TWLG_SWEDISH_FINLAND = 108;
TWLG_TAMIL = 109;
TWLG_TELUGU = 110;
TWLG_TRIPURI = 111;
TWLG_URDU = 112;
TWLG_VIETNAMESE = 113;
Const
TWRC_SUCCESS = 0;
TWRC_FAILURE = 1; // Application may get TW_STATUS for
// info on failure
TWRC_CHECKSTATUS = 2; // tried hard to get the status
TWRC_CANCEL = 3;
TWRC_DSEVENT = 4;
TWRC_NOTDSEVENT = 5;
TWRC_XFERDONE = 6;
TWRC_ENDOFLIST = 7; // After MSG_GETNEXT if nothing left
TWRC_INFONOTSUPPORTED = 8;
TWRC_DATANOTAVAILABLE = 9;
Const
TWON_ONEVALUE = $05; // indicates TW_ONEVALUE container
TWON_DONTCARE8 = $FF;
Const
ICAP_XFERMECH = $0103;
Const
TWTY_UINT16 = $0004; // Means: item is a TW_UINT16
Const
// ICAP_XFERMECH values (SX_ means Setup XFer)
TWSX_NATIVE = 0;
TWSX_FILE = 1;
TWSX_MEMORY = 2;
TWSX_FILE2 = 3;
Type
TW_UINT16 = WORD; // unsigned short TW_UINT16
pTW_UINT16 = ^TW_UINT16;
TTWUInt16 = TW_UINT16;
PTWUInt16 = pTW_UINT16;
Type
TW_BOOL = WORDBOOL; // unsigned short TW_BOOL
pTW_BOOL = ^TW_BOOL;
TTWBool = TW_BOOL;
PTWBool = pTW_BOOL;
Type
TW_STR32 = Array[0..33] of Char; // char TW_STR32[34]
pTW_STR32 = ^TW_STR32;
TTWStr32 = TW_STR32;
PTWStr32 = pTW_STR32;
Type
TW_STR255 = Array[0..255] of Char; // char TW_STR255[256]
pTW_STR255 = ^TW_STR255;
TTWStr255 = TW_STR255;
PTWStr255 = pTW_STR255;
Type
TW_INT16 = SmallInt; // short TW_INT16
pTW_INT16 = ^TW_INT16;
TTWInt16 = TW_INT16;
PTWInt16 = pTW_INT16;
Type
TW_UINT32 = ULONG; // unsigned long TW_UINT32
pTW_UINT32 = ^TW_UINT32;
TTWUInt32 = TW_UINT32;
PTWUInt32 = pTW_UINT32;
Type
TW_HANDLE = THandle;
TTWHandle = TW_HANDLE;
TW_MEMREF = Pointer;
TTWMemRef = TW_MEMREF;
Type
// DAT_PENDINGXFERS. Used with MSG_ENDXFER to indicate additional
// data
TW_PENDINGXFERS = Packed record
Count : TW_UINT16;
Case Boolean of
False : (EOJ : TW_UINT32);
True : (Reserved : TW_UINT32);
End;
pTW_PENDINGXFERS = ^TW_PENDINGXFERS;
TTWPendingXFERS = TW_PENDINGXFERS;
PTWPendingXFERS = pTW_PENDINGXFERS;
Type
// DAT_EVENT. For passing events down from the application to the DS
TW_EVENT = Packed record
pEvent : TW_MEMREF; // Windows pMSG or Mac pEvent.
TWMessage : TW_UINT16; // TW msg from data source, e.g.
// MSG_XFERREADY
End;
pTW_EVENT = ^TW_EVENT;
TTWEvent = TW_EVENT;
PTWEvent = pTW_EVENT;
Type
// TWON_ONEVALUE. Container for one value
TW_ONEVALUE = Packed record
ItemType : TW_UINT16;
Item : TW_UINT32;
End;
pTW_ONEVALUE = ^TW_ONEVALUE;
TTWOneValue = TW_ONEVALUE;
PTWOneValue = pTW_ONEVALUE;
Type
// DAT_CAPABILITY. Used by application to get/set capability from/in
// a data source.
TW_CAPABILITY = Packed record
Cap : TW_UINT16; // id of capability to set or get, e.g.
// CAP_BRIGHTNESS
ConType : TW_UINT16; // TWON_ONEVALUE, _RANGE, _ENUMERATION or
// _ARRAY
hContainer : TW_HANDLE; // Handle to container of type Dat
End;
pTW_CAPABILITY = ^TW_CAPABILITY;
TTWCapability = TW_CAPABILITY;
PTWCapability = pTW_CAPABILITY;
Type
// DAT_STATUS. Application gets detailed status info from a data
// source with this
TW_STATUS = Packed record
ConditionCode : TW_UINT16; // Any TWCC_xxx constant
Reserved : TW_UINT16; // Future expansion space
End;
pTW_STATUS = ^TW_STATUS;
TTWStatus = TW_STATUS;
PTWStatus = pTW_STATUS;
Type
// No DAT needed. Used to manage memory buffers
TW_MEMORY = Packed record
Flags : TW_UINT32; // Any combination of the TWMF_ constants
Length : TW_UINT32; // Number of bytes stored in buffer TheMem
TheMem : TW_MEMREF; // Pointer or handle to the allocated memory
// buffer
End;
pTW_MEMORY = ^TW_MEMORY;
TTWMemory = TW_MEMORY;
PTWMemory = pTW_MEMORY;
Const
// ICAP_IMAGEFILEFORMAT values (FF_means File Format
TWFF_TIFF = 0; // Tagged Image File Format
TWFF_PICT = 1; // Macintosh PICT
TWFF_BMP = 2; // Windows Bitmap
TWFF_XBM = 3; // X-Windows Bitmap
TWFF_JFIF = 4; // JPEG File Interchange Format
TWFF_FPX = 5; // Flash Pix
TWFF_TIFFMULTI = 6; // Multi-page tiff file
TWFF_PNG = 7; // Portable Network Graphic
TWFF_SPIFF = 8;
TWFF_EXIF = 9;
Type
// DAT_SETUPFILEXFER. Sets up DS to application data transfer via a
// file
TW_SETUPFILEXFER = Packed record
FileName : TW_STR255;
Format : TW_UINT16; // Any TWFF_xxx constant
VRefNum : TW_INT16; // Used for Mac only
End;
pTW_SETUPFILEXFER = ^TW_SETUPFILEXFER;
TTWSetupFileXFER = TW_SETUPFILEXFER;
PTWSetupFileXFER = pTW_SETUPFILEXFER;
Type
// DAT_SETUPFILEXFER2. Sets up DS to application data transfer via a
// file. }
TW_SETUPFILEXFER2 = Packed record
FileName : TW_MEMREF; // Pointer to file name text
FileNameType : TW_UINT16; // TWTY_STR1024 or TWTY_UNI512
Format : TW_UINT16; // Any TWFF_xxx constant
VRefNum : TW_INT16; // Used for Mac only
parID : TW_UINT32; // Used for Mac only
End;
pTW_SETUPFILEXFER2 = ^TW_SETUPFILEXFER2;
TTWSetupFileXFER2 = TW_SETUPFILEXFER2;
PTWSetupFileXFER2 = pTW_SETUPFILEXFER2;
Type
// DAT_SETUPMEMXFER. Sets up Data Source to application data
// transfer via a memory buffer
TW_SETUPMEMXFER = Packed record
MinBufSize : TW_UINT32;
MaxBufSize : TW_UINT32;
Preferred : TW_UINT32;
End;
pTW_SETUPMEMXFER = ^TW_SETUPMEMXFER;
TTWSetupMemXFER = TW_SETUPMEMXFER;
PTWSetupMemXFER = pTW_SETUPMEMXFER;
Type
TW_VERSION = Packed record
MajorNum : TW_UINT16; // Major revision number of the software.
MinorNum : TW_UINT16; // Incremental revision number of the
// software
Language : TW_UINT16; // e.g. TWLG_SWISSFRENCH
Country : TW_UINT16; // e.g. TWCY_SWITZERLAND
Info : TW_STR32; // e.g. "1.0b3 Beta release"
End;
pTW_VERSION = ^TW_VERSION;
PTWVersion = pTW_VERSION;
TTWVersion = TW_VERSION;
Type
TW_IDENTITY = Packed record
Id : TW_UINT32; // Unique number. In Windows,
// application hWnd
Version : TW_VERSION; // Identifies the piece of code
ProtocolMajor : TW_UINT16; // Application and DS must set to
// TWON_PROTOCOLMAJOR
ProtocolMinor : TW_UINT16; // Application and DS must set to
// TWON_PROTOCOLMINOR
SupportedGroups : TW_UINT32; // Bit field OR combination of DG_
// constants
Manufacturer : TW_STR32; // Manufacturer name, e.g.
// "Hewlett-Packard"
ProductFamily : TW_STR32; // Product family name, e.g.
// "ScanJet"
ProductName : TW_STR32; // Product name, e.g. "ScanJet Plus"
End;
pTW_IDENTITY = ^TW_IDENTITY;
Type
// DAT_USERINTERFACE. Coordinates UI between application and data
// source
TW_USERINTERFACE = Packed record
ShowUI : TW_BOOL; // TRUE if DS should bring up its UI
ModalUI : TW_BOOL; // For Mac only - true if the DS's UI is modal
hParent : TW_HANDLE; // For Windows only - Application handle
End;
pTW_USERINTERFACE = ^TW_USERINTERFACE;
TTWUserInterface = TW_USERINTERFACE;
PTWUserInterface = pTW_USERINTERFACE;
////////////////////////////////////////////////////////////////////////
// //
// END OF TWAIN TYPES AND CONSTANTS //
// //
////////////////////////////////////////////////////////////////////////
Const
TWAIN_DLL_Name = 'TWAIN_32.DLL';
DSM_Entry_Name = 'DSM_Entry';
Ini_File_Name = 'WIN.INI';
CrLf = #13 + #10;
Resourcestring // Errorstrings:
ERR_DSM_ENTRY_NOT_FOUND = 'Unable to find the entry of the Data ' +
'Source Manager in: TWAIN_32.DLL';
ERR_TWAIN_NOT_LOADED = 'Unable to load or find: TWAIN_32.DLL';
ERR_DSM_CALL_FAILED = 'A call to the Data Source Manager failed ' +
'in module %s';
ERR_UNKNOWN = 'A call to the Data Source Manager failed ' +
'in module %s: Code %.04x';
ERR_DSM_OPEN = 'Unable to close the Data Source Manager. ' +
'Maybe a source is still in use';
ERR_STATUS = 'Unable to get the status';
ERR_DSM = 'Data Source Manager error in module %s:' +
CrLf + '%s';
ERR_DS = 'Data Source error in module %s:' +
CrLf + '%s';
Type
ETwainError = Class(Exception);
TImageType = (ffTIFF,ffPICT,ffBMP,ffXBM,ffJFIF,ffFPX,
ffTIFFMULTI,ffPNG,ffSPIFF,ffEXIF,ffUNKNOWN);
TTransferType = (xfNative,xfMemory,xfFile);
TLanguageType = (lgDutch, lgEnglish,
lgFrench, lgGerman,
lgAmerican, lgItalian,
lgSpanish, lgNorwegian,
lgFinnish, lgDanish,
lgRussian, lgPortuguese,
lgSwedish, lgPolish,
lgGreek, lgTurkish);
TCountryType = (ctNetherlands,ctEngland,
ctFrance, ctGermany,
ctUSA, ctSpain,
ctItaly, ctDenmark,
ctFinland, ctNorway,
ctRussia, ctPortugal,
ctSweden, ctPoland,
ctGreece, ctTurkey);
TTWAIN = Class(TComponent)
Private
// Private declarations
fBitmap : TBitmap; // the actual bmp used for
// scanning, must be
// removed
HDSMDLL : HMODULE; // = 0, the library handle:
// will stay global
appId : TW_IDENTITY; // our (Application) ID.
// (may stay global)
dsId : TW_IDENTITY; // Data Source ID (will
// become member of DS
// class)
fhWnd : HWND; // = 0, maybe will be
// removed, use
// application.handle
// instead
fXfer : TTransferType; // = xfNative;
bDataSourceManagerOpen : Boolean; // = False, flag, may stay
// global
bDataSourceOpen : Boolean; // = False, will become
// member of DS class
bDataSourceEnabled : Boolean; // = False, will become
// member of DS class
fScanReady : TNotifyEvent; // notifies that the scan
// is ready
sDefaultSource : String; // remember old data source
fOldOnMessageHandler : TMessageEvent; // Save old OnMessage event
fShowUI : Boolean; // Show User Interface
fSetupFileXfer : TW_SETUPFILEXFER; // Not used yet
fSetupMemoryXfer : TW_SETUPMEMXFER; // Not used yet
fMemory : TW_MEMORY; // Not used yet
Function fLoadTwain : Boolean;
Procedure fUnloadTwain;
Function fNativeXfer : Boolean;
Function fMemoryXfer : Boolean; // Not used yet
Function fFileXfer : Boolean; // Not used yet
Function fGetDestination : TTransferType;
Procedure fSetDestination(dest : TTransferType);
Function Condition2String(ConditionCode : TW_UINT16) : String;
Procedure RaiseLastDataSourceManagerCondition(module : String);
Procedure RaiseLastDataSourceCondition(module : String);
Procedure TwainCheckDataSourceManager(res : TW_UINT16;
module : String);
Procedure TwainCheckDataSource(res : TW_UINT16;
module : string);
Function CallDataSourceManager(pOrigin : pTW_IDENTITY;
DG : TW_UINT32;
DAT : TW_UINT16;
MSG : TW_UINT16;
pData : TW_MEMREF) : TW_UINT16;
Function CallDataSource (DG : TW_UINT32;
DAT : TW_UINT16;
MSG : TW_UINT16;
pData : TW_MEMREF) : TW_UINT16;
Procedure XferMech;
Procedure fSetProductname(pn : String);
Function fGetProductname : String;
Procedure fSetManufacturer(mf : String);
Function fGetManufacturer : String;
Procedure fSetProductFamily(pf : String);
Function fGetProductFamily : String;
Procedure fSetLanguage(lg : TLanguageType);
Function fGetLanguage : TLanguageType;
Procedure fSetCountry(ct : TCountryType);
Function fGetCountry : TCountryType;
Procedure SaveDefaultSourceEntry;
Procedure RestoreDefaultSourceEntry;
Procedure fSetCursor(cr : TCursor);
Function fGetCursor : TCursor;
Procedure fSetImageType(it : TImageType);
Function fGetImageType : TImageType;
Procedure fSetFilename(fn : String);
Function fGetFilename : String;
Procedure fSetVersionInfo(vi : String);
Function fGetVersionInfo : String;
Procedure fSetVersionMajor(vmaj : WORD);
Procedure fSetVersionMinor(vmin : WORD);
Function fGetVersionMajor : WORD;
Function fGetVersionMinor : WORD;
Protected
Procedure ScanReady; dynamic; // Notifies when image transfer is
// ready
Procedure fNewOnMessageHandler(Var Msg : TMsg;
Var Handled : Boolean); virtual;
Public
// Public declarations
Constructor Create(AOwner : TComponent); override;
Destructor Destroy; override;
Procedure Acquire(aBmp : TBitmap);
Procedure OpenDataSource;
Procedure CloseDataSource;
Procedure InitTWAIN;
Procedure OpenDataSourceManager;
Procedure CloseDataSourceManager;
Function IsDataSourceManagerOpen : Boolean;
Procedure EnableDataSource;
// Procedure TWEnableDSUIOnly(ShowUI : Boolean);
Procedure DisableDataSource;
Function IsDataSourceOpen : Boolean;
Function IsDataSourceEnabled : Boolean;
Procedure SelectDataSource;
Function IsTwainDriverAvailable : Boolean;
Function ProcessSourceMessage(Var Msg : TMsg): Boolean;
Published
// Published declarations
// Properties, methods
Property Destination : TTransferType
Read fGetDestination write fSetDestination;
Property TwainDriverFound : Boolean
Read IsTwainDriverAvailable;
Property Productname : String
Read fGetProductname write fSetProductname;
Property Manufacturer : String
Read fGetManufacturer write fSetManufacturer;
Property ProductFamily : String
Read fGetProductFamily write fSetProductFamily;
Property Language : TLanguageType
Read fGetLanguage write fSetLanguage;
Property Country : TCountryType
Read fGetCountry write fSetCountry;
Property ShowUI : Boolean
Read fShowUI write fShowUI;
Property Cursor : TCursor
Read fGetCursor write fSetCursor;
Property FileFormat : TImageType
Read fGetImageType write fSetImageType;
Property Filename : String
Read fGetFilename write fSetFilename;
Property VersionInfo : String
Read fGetVersionInfo write fSetVersionInfo;
Property VersionMajor : WORD
Read fGetVersionMajor write fSetVersionMajor;
Property VersionMinor : WORD
Read fGetVersionMinor Write fSetVersionMinor;
// Events
Property OnScanReady : TNotifyEvent
Read fScanReady write fScanReady;
End;
Procedure Register;
Type
DSMENTRYPROC = Function(pOrigin : pTW_IDENTITY;
pDest : pTW_IDENTITY;
DG : TW_UINT32;
DAT : TW_UINT16;
MSG : TW_UINT16;
pData : TW_MEMREF) : TW_UINT16; stdcall;
TDSMEntryProc = DSMENTRYPROC;
Type
DSENTRYPROC = Function( pOrigin : pTW_IDENTITY;
DG : TW_UINT32;
DAT : TW_UINT16;
MSG : TW_UINT16;
pData : TW_MEMREF) : TW_UINT16; stdcall;
TDSEntryProc = DSENTRYPROC;
Var
DS_Entry : TDSEntryProc = nil; // Initialize
DSM_Entry : TDSMEntryProc = nil; // Initialize
Implementation
//---------------------------------------------------------------------
Constructor TTWAIN.Create(AOwner : TComponent);
Begin
Inherited Create(AOwner);
// Initialize variables
appID.Version.Info := 'Twain component';
appID.Version.Country := TWCY_USA;
appID.Version.Language := TWLG_USA;
appID.Productname := 'SimpelSoft TWAIN module'; // This is the one that you are
// going to see in the UI
appID.ManuFacturer := 'SimpelSoft';
appID.ProductFamily := 'SimpelSoft components';
appID.Version.MajorNum := 1;
appID.Version.MinorNum := 0;
// appID.ID := Application.Handle;
fSetFilename('C:\TWAIN.BMP');
// fSetupFileXfer.FileName := 'C:\TWAIN.TMP':
fSetImageType(ffBMP);
// fSetupFileXfer.Format := TWFF_BMP;
// fSetupFileXfer.VRefNum := xx; // For Mac
// fSetupMemoryXfer.MinBufSize := xx;
// fSetupMemoryXfer.MaxBufSize := yy;
// fSetupMemoryXfer.Preferred := zz;
fMemory.Flags := TWFF_BMP;
// fMemory.Length := SizeOf(Mem);
// fMemory.TheMem := @Mem;
// fhWnd := Application.Handle;
fShowUI := True;
HDSMDLL := 0;
sDefaultSource := '';
fXfer := xfNative;
bDataSourceManagerOpen := False;
bDataSourceOpen := False;
bDataSourceEnabled := False;
End;
//---------------------------------------------------------------------
Destructor TTWAIN.Destroy;
Begin
If bDataSourceEnabled then
DisableDataSource;
If bDataSourceOpen then
CloseDataSource;
If bDataSourceManagerOpen then
CloseDataSourceManager;
fUnLoadTwain; // Loose the TWAIN_32.DLL
If sDefaultSource <> '' then
RestoreDefaultSourceEntry; // Write old entry back in WIN.INI
Application.OnMessage := fOldOnMessageHandler; // Restore old OnMessage
// handler
Inherited Destroy;
End;
//---------------------------------------------------------------------
Function TTWAIN.fGetVersionMajor : WORD;
Begin
Result := appID.Version.MajorNum;
End;
//---------------------------------------------------------------------
Function TTWAIN.fGetVersionMinor : WORD;
Begin
Result := appID.Version.MinorNum;
End;
//---------------------------------------------------------------------
Procedure TTWAIN.fSetVersionMajor(vmaj : WORD);
Begin
appID.Version.MajorNum := vmaj;
End;
//---------------------------------------------------------------------
Procedure TTWAIN.fSetVersionMinor(vmin : WORD);
Begin
appID.Version.MinorNum := vmin;
End;
//---------------------------------------------------------------------
Procedure TTWAIN.fSetVersionInfo(vi : String);
Var
I,L : Integer;
Begin
FillChar(appID.Version.Info,SizeOf(appID.Version.Info),#0);
L := Length(vi);
If L = 0 then
Exit;
If L > 32 then
L := 32;
For I := 1 to L do
appID.Version.Info[I - 1] := vi[I];
End;
//---------------------------------------------------------------------
Function TTWAIN.fGetVersionInfo : String;
Var
I : Integer;
Begin
Result := '';
I := 0;
If appID.Version.Info[I] <> #0 then
Repeat
Result := Result + appID.Version.Info[I];
Inc(I);
Until appID.Version.Info[I] = #0;
End;
//---------------------------------------------------------------------
Procedure TTWAIN.fSetImageType(it : TImageType);
Begin
fSetupFileXfer.Format := TWFF_BMP; // Initialize
fMemory.Flags := TWFF_BMP; // Initialize
Case it of
ffTIFF : Begin
fSetupFileXfer.Format := TWFF_TIFF;
fMemory.Flags := TWFF_TIFF;
End;
ffPICT : Begin
fSetupFileXfer.Format := TWFF_PICT;
fMemory.Flags := TWFF_PICT;
End;
ffBMP : Begin
fSetupFileXfer.Format := TWFF_BMP;
fMemory.Flags := TWFF_BMP;
End;
ffXBM : Begin
fSetupFileXfer.Format := TWFF_XBM;
fMemory.Flags := TWFF_XBM;
End;
ffJFIF : Begin
fSetupFileXfer.Format := TWFF_JFIF;
fMemory.Flags := TWFF_JFIF;
End;
ffFPX : Begin
fSetupFileXfer.Format := TWFF_FPX;
fMemory.Flags := TWFF_FPX;
End;
ffTIFFMULTI : Begin
fSetupFileXfer.Format := TWFF_TIFFMULTI;
fMemory.Flags := TWFF_TIFFMULTI;
End;
ffPNG : Begin
fSetupFileXfer.Format := TWFF_PNG;
fMemory.Flags := TWFF_PNG;
End;
ffSPIFF : Begin
fSetupFileXfer.Format := TWFF_SPIFF;
fMemory.Flags := TWFF_SPIFF;
End;
ffEXIF : Begin
fSetupFileXfer.Format := TWFF_EXIF;
fMemory.Flags := TWFF_EXIF;
End;
End;
End;
//---------------------------------------------------------------------
Procedure TTWAIN.fSetFilename(fn : String);
Var
L,I : Integer;
Begin
FillChar(fSetupFileXfer.FileName,SizeOf(fSetupFileXfer.Filename),#0);
L := Length(fn);
If L > 0 then
For I := 1 to L do
fSetupFileXfer.Filename[I - 1] := fn[I];
End;
//---------------------------------------------------------------------
Function TTWAIN.fGetFilename : String;
Var
I : Integer;
Begin
Result := '';
I := 0;
If fSetupFileXfer.Filename[I] <> #0 then
Repeat
Result := Result + fSetupFileXfer.Filename[I];
Inc(I);
Until fSetupFileXfer.Filename[I] = #0;
End;
//---------------------------------------------------------------------
Function TTWAIN.fGetImageType : TImageType;
Begin
Result := ffUNKNOWN; // Initialize
Case fSetupFileXfer.Format of
TWFF_TIFF : Result := ffTIFF;
TWFF_PICT : Result := ffPICT;
TWFF_BMP : Result := ffBMP;
TWFF_XBM : Result := ffXBM;
TWFF_JFIF : Result := ffJFIF;
TWFF_FPX : Result := ffFPX;
TWFF_TIFFMULTI : Result := ffTIFFMULTI;
TWFF_PNG : Result := ffPNG;
TWFF_SPIFF : Result := ffSPIFF;
TWFF_EXIF : Result := ffEXIF;
End;
End;
//---------------------------------------------------------------------
Procedure TTWAIN.fSetCursor(cr : TCursor);
Begin
Screen.Cursor := cr;
End;
//---------------------------------------------------------------------
Function TTWAIN.fGetCursor : TCursor;
Begin
Result := Screen.Cursor;
End;
//---------------------------------------------------------------------
Procedure TTWAIN.fSetCountry(ct : TCountryType);
Begin
Case ct of
ctDenmark : appID.Version.Country := TWCY_DENMARK;
ctNetherlands : appID.Version.Country := TWCY_NETHERLANDS;
ctEngland : appID.Version.Country := TWCY_BRITAIN;
ctFinland : appID.Version.Country := TWCY_FINLAND;
ctFrance : appID.Version.Country := TWCY_FRANCE;
ctGermany : appID.Version.Country := TWCY_GERMANY;
ctItaly : appID.Version.Country := TWCY_ITALY;
ctNorWay : appID.Version.Country := TWCY_NORWAY;
ctSpain : appID.Version.Country := TWCY_SPAIN;
ctUSA : appID.Version.Country := TWCY_USA;
ctRussia : appID.Version.Country := TWCY_RUSSIA;
ctPortugal : appID.Version.Country := TWCY_PORTUGAL;
ctSweden : appID.Version.Country := TWCY_SWEDEN;
ctPoland : appID.Version.Country := TWCY_POLAND;
ctGreece : appID.Version.Country := TWCY_GREECE;
ctTurkey : appID.Version.Country := TWCY_TURKEY;
End;
End;
//---------------------------------------------------------------------
Function TTWAIN.fGetCountry : TCountryType;
Begin
Result := ctNetherlands; // Initialize
Case appID.Version.Country of
TWCY_NETHERLANDS : Result := ctNetherlands;
TWCY_DENMARK : Result := ctDenmark;
TWCY_BRITAIN : Result := ctEngland;
TWCY_FINLAND : Result := ctFinland;
TWCY_FRANCE : Result := ctFrance;
TWCY_GERMANY : Result := ctGermany;
TWCY_NORWAY : Result := ctNorway;
TWCY_ITALY : Result := ctItaly;
TWCY_SPAIN : Result := ctSpain;
TWCY_USA : Result := ctUSA;
TWCY_RUSSIA : Result := ctRussia;
TWCY_PORTUGAL : Result := ctPortugal;
TWCY_SWEDEN : Result := ctSweden;
TWCY_TURKEY : Result := ctTurkey;
TWCY_GREECE : Result := ctGreece;
TWCY_ |