IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Problème Migration class .NET 3.5 en 4 > EZTW32.DLL


Sujet :

VB.NET

  1. #1
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 87
    Points : 44
    Points
    44
    Par défaut
    Bonjour à tous,

    J'ai récemment eu besoin de migrer la classe ci dessous de .NET 3.5 ver 4 mais je rencontre le problème suivant à l'exécution.
    En l'état, le code fonctionne parfaitement sous 3.5.

    Erreur
    Un appel à la fonction PInvoke 'Scan dotnet!WindowsApplication1.Scanner::TWAIN_OpenSourceManager' a déséquilibré la pile. Cela peut se produire, car la signature PInvoke managée ne correspond pas à la signature cible non managée. Vérifiez que la convention d'appel et les paramètres de la signature PInvoke correspondent à la signature non managée cible.
    Class
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    Public Class Scanner
     
        Declare Function TWAIN_AcquireToClipboard Lib "EZTW32.DLL" (ByVal hwndApp&, ByVal wPixTypes&) As Integer
        Declare Function TWAIN_SetHideUI Lib "Eztw32.dll" Alias "TWAIN_SetHideUI" (ByVal ui As Long) As Long
        Declare Function TWAIN_OpenDefaultSource Lib "Eztw32.DLL" Alias "TWAIN_OpenDefaultSource" (ByVal hwnd As Long) As Integer
        Declare Function TWAIN_SetCurrentResolution Lib "Eztw32.dll" Alias "TWAIN_SetCurrentResolution" (ByVal neufdix As Double) As Long
        Declare Function TWAIN_SetCurrentPixelType Lib "Eztw32.dll" Alias "TWAIN_SetCurrentPixelType" (ByVal deux As Long) As Long
        Declare Function TWAIN_LoadSourceManager Lib "Eztw32.dll" Alias "TWAIN_LoadSourceManager" () As Long
        Declare Function TWAIN_SetCurrentUnits Lib "Eztw32.dll" Alias "TWAIN_SetCurrentUnits" (ByVal zero As Long) As Long
        Declare Function TWAIN_SetBitDepth Lib "Eztw32.dll" Alias "TWAIN_SetBitDepth" (ByVal zero As Long) As Long
        Declare Function TWAIN_OpenSourceManager Lib "EZTW32.DLL" Alias "TWAIN_OpenSourceManager" (ByVal hwnd As Long) As Long
        Declare Function TWAIN_CloseSource Lib "EZTW32.DLL" Alias "TWAIN_CloseSource" () As Long
        Declare Function TWAIN_SelectImageSource Lib "EZTW32.DLL" Alias "TWAIN_SelectImageSource" (ByVal hwnd As Long) As Integer
        Declare Function TWAIN_State Lib "EZTW32.DLL" Alias "TWAIN_State" () As Integer
     
        Declare Function TWAIN_AcquireToFilename Lib "Eztwain3.dll" (ByVal hwndApp As Long, ByVal sFile As String) As Long
        Declare Function TWAIN_SelectFeeder Lib "EZTW32.DLL" (ByVal fYes As Long) As Long
        Declare Function TWAIN_SetCurrentResolution Lib "EZTW32.DLL" (ByVal nRes As Long) As Long
     
        Declare Function TWAIN_LogFile Lib "EZTW32.DLL" (ByVal fLog As Long) As Long
        Declare Function TWAIN_SetAutoScan Lib "EZTW32.DLL" (ByVal fYes As Long) As Long
        Declare Function TWAIN_SetRegion Lib "EZTW32.DLL" (ByVal L As Double, ByVal T As Double, ByVal R As Double, ByVal B As Double) As Long
     
        Declare Function TWAIN_AcquireMultipageFile Lib "EZTW32.DLL" (ByVal hwndApp As Long, ByVal FileName As String) As Long
        Declare Function TWAIN_LastErrorCode Lib "EZTW32.DLL" () As Long
        Declare Function TWAIN_ReportLastError Lib "EZTW32.DLL" (ByVal pzMsg As String) As Long
     
        Declare Function TWAIN_GetCurrentResolution Lib "EZTW32.DLL" () As Long
     
     
        Dim THdl As Integer = 0
     
        Public Sub New(ByVal Hdl As Integer)
            THdl = Hdl
        End Sub
     
        ''' <summary>
        ''' récupération du résultat du scan
        ''' </summary>
        Public Function Scan() As Drawing.Image
     
     
            Dim Img As Drawing.Image = Nothing
            Try
     
                Dim Ret As Integer = 0
     
                'Paramètre du Scan
                If TWAIN_State() < 4 Then
                    MsgBox("Impossible de paramêtrer le scanner", MsgBoxStyle.Exclamation)
                Else
                    'parametres du scanner
                    TWAIN_SetCurrentUnits(0) 'DPI
                    TWAIN_SetCurrentResolution(600) 'en points par pouces
                    TWAIN_SetCurrentPixelType(2) ' Scan format 0 = B&W, 1 Grey, 2 RGB
                    TWAIN_SetBitDepth(8) ' Bit Depth 1, 2, 4, 8 but depends on Pixeltype
                    TWAIN_SetHideUI(1)
                End If
     
                'scan du document
                Ret = TWAIN_AcquireToClipboard(THdl, 32)
                Img = CType(Clipboard.GetDataObject.GetData(System.Windows.Forms.DataFormats.Bitmap), Bitmap)
     
            Catch ex As Exception
                Img = Nothing
            End Try
     
            Return Img
     
        End Function
        Public Sub ChoixScan()
     
            Try
     
                Dim Ret As Integer = 0
                'Fermeture de la source du scan
                TWAIN_CloseSource()
                TWAIN_LoadSourceManager()
                TWAIN_OpenSourceManager(THdl)
     
                Ret = TWAIN_SelectImageSource(THdl)
                If Ret = 1 Then
                    Ret = TWAIN_OpenDefaultSource(THdl)
                End If
     
                If TWAIN_State() < 4 Then
                    MsgBox("Impossible de paramêtrer le scanner", MsgBoxStyle.Exclamation)
                Else
                    'parametres du scanner
                    TWAIN_SetCurrentUnits(0) 'DPI
                    TWAIN_SetCurrentResolution(150) 'en points par pouces
                    TWAIN_SetCurrentPixelType(2) ' Scan format 0 = B&W, 1 Grey, 2 RGB
                    TWAIN_SetBitDepth(8) ' Bit Depth 1, 2, 4, 8 but depends on Pixeltype
                    TWAIN_SetHideUI(1)
                End If
     
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
     
        End Sub
     
        Public Sub Test()
     
            '************************************************
            'TWAIN_SetContrast (8) 
            'TWAIN_SetBrightness (8)
            'TWAIN_SetThreshold (8)
            'TWAIN_SetGamma (8)
            'TWAIN_SetShadow (8)
            'TWAIN_SetHighlight (8)
            '************************************************
     
            Dim TypDoc As Integer = 0
            TypDoc = 0  'Noir et Blanc
            TypDoc = 1  'Nuance de gris
            TypDoc = 2  'Couleur
     
            Dim Bit As Integer = 0
            Bit = 1  'Noir et Blanc
            Bit = 8  'Nuance de gris
            Bit = 8  'Couleur
     
            Dim fileName As String
            fileName = "D:\SCAN_DOC.pdf"
            'TWAIN_LogFile(1)
            TWAIN_SetHideUI(1)  'Cache l'interface utilisateur
            If TWAIN_OpenDefaultSource(THdl) = 1 Then
                'Call TWAIN_SelectFeeder(1)
     
                Dim Ret As Integer = TWAIN_GetCurrentResolution
     
                TWAIN_SetCurrentPixelType(TypDoc)
                TWAIN_SetBitDepth(Bit)
                TWAIN_SetCurrentResolution(Ret)
                'Call TWAIN_SetAutoScan(1)
                'Call TWAIN_SetRegion(0, 5, 3, 7)
                TWAIN_AcquireToClipboard(THdl, 32)
                'TWAIN_AcquireMultipageFile(THdl, fileName)
            End If
            'If TWAIN_LastErrorCode() <> 0 Then
            '    TWAIN_ReportLastError("Unable to scan.")
            'End If
     
            MsgBox("fin")
     
        End Sub
     
     
    End Class
    Merci pour votre aide

    Peut être un avis sur le message d'erreur.

    Cela peut se produire, car la signature PInvoke managée ne correspond pas à la signature cible non managée. Vérifiez que la convention d'appel et les paramètres de la signature PInvoke correspondent à la signature non managée cible.

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    Bonjour

    Tu n'as pas changé de mode 32 vers 64 bits par hasard ?

  3. #3
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 87
    Points : 44
    Points
    44
    Par défaut
    Bonjour,

    Je crois pas. J'ai juste changer la version du framework dans Compiler sous VS2010.

  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    pour la version du framework ne prend pas la v4 client profile mais l'autre v4 peut être et pour le cpu choisit AnyCpu

  5. #5
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 87
    Points : 44
    Points
    44
    Par défaut
    Bonjour,

    C'est déjà configurer de cette manière dans les options avancées de compilation.

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    A tout hasard, normalise tes types de variables; par exemple,dans la fonction-ki-péte tu attends un Long et tu passes un Integer.

    Je ne sais comment VB.Net gère ça, mais il n'est pas impossible que le P/Invoke soit devenu chatouilleux là dessus.

    Tu compiles avec l'option STRICT (connais pas la syntaxe exact, n'utilisant pas VB.Net) ? si ce n'est pas le cas, je te suggère fortement de la mettre.

    Tu es sur que ton évolution de framework ne s'est accompagnée d'aucun changement de version de ta DLL Twain_* ?

  7. #7
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 87
    Points : 44
    Points
    44
    Par défaut
    J'ai activé les déclaration STRICT. Mis des long ou on attendes des long.
    J'ai déplacer le problème. Maintenant le problème se produit sur la fonction TWAIN_OpenDefaultSource.

    Citation Envoyé par Bluedeep Voir le message
    Tu es sur que ton évolution de framework ne s'est accompagnée d'aucun changement de version de ta DLL Twain_* ?
    C'est peut être le problème mais je n'en sais rien.
    Quelqu'un aurait il une version plus récente de EZTW32.DLL compatible avec .net 4 ?

  8. #8
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    Citation Envoyé par fufurax Voir le message
    J'ai activé les déclaration STRICT. Mis des long ou on attendes des long.
    J'ai déplacer le problème. Maintenant le problème se produit sur la fonction TWAIN_OpenDefaultSource.
    Ah ! donc on tient le bon bout

    Modifie le type de retour TWAIN_OpenDefaultSource en 'as Long' en lieu et place de 'As Integer'. Et bien sur, retourne la valeur dans un Long et pas dans un Integer.

    A mon avis, tes problèmes viennent d'une réduction du laxisme de VB.Net sur le typage entre la 3.5 et la 4.

    C'est peut être le problème mais je n'en sais rien.
    Quelqu'un aurait il une version plus récente de EZTW32.DLL compatible avec .net 4 ?
    Il ne peut pas y avoir de problèmes de compatibilité normalement à ce stade : c'est du p/invoke. Ma question était plutot l'inverse : la DLL que tu utilises est-elle celle qui fonctionne avec le 3.5 ? commence par controler cela.

  9. #9
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 87
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Il ne peut pas y avoir de problèmes de compatibilité normalement à ce stade : c'est du p/invoke. Ma question était plutot l'inverse : la DLL que tu utilises est-elle celle qui fonctionne avec le 3.5 ? commence par controler cela.
    Elle fonctionnait en 3.5 sans soucis.

    J'ai modifié le code et maintenant ça fonctionne parfaitement de toute évidence, le problème venait des déclarations du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Declare Function TWAIN_AcquireToClipboard Lib "EZTW32.DLL" (ByVal hwndApp&, ByVal wPixTypes&) As Integer
    Ci-dessous le code qui tourne sous .NET 4.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
    587
    588
    589
    590
    591
    592
    593
    594
    595
    596
    597
    598
    599
    600
    601
    602
    603
    604
    605
    606
    607
    608
    609
    610
    611
    612
    613
    614
    615
    616
    617
    618
    619
    620
    621
    622
    623
    624
    625
    626
    627
    628
    629
    630
    631
    632
    633
    634
    635
    636
    637
    638
    639
    640
    641
    642
    Imports System
    Imports System.Runtime.InteropServices
    Imports System.Drawing
     
     
    Friend Class GestScan
     
    #Region "EZTwain"
        'Public Shared Function DibToImage(ByVal hdib As System.IntPtr) As Image
        '    Dim data(EZTwain.DIB_Size(hdib) + 100) As Byte
        '    EZTwain.DIB_WriteToBuffer(hdib, EZTwain.TWFF_BMP, data(0), data.Length)
        '    Dim s As New System.IO.MemoryStream(data, False)
        '    Dim bm As Bitmap = Bitmap.FromStream(s)
        '    DibToImage = bm.Clone
        '    bm.Dispose()
        'End Function
     
        ' EZTWAIN.H - interface to Easy TWAIN library
        ' (DLL=eztw32.dll)
        '
        ' 1.15     2006.05.09 Fix: If user closed the scan dialog during an Acquire,
        '                     the last DIB handle, if any, was returned!
        '                     Added VB\Eztwain.bas to package.
        ' 1.14     2004.08.06 Set XFERMECH=NATIVE as soon as DS is opened.
        '                     trying to deal with scanners that default to memory xfer.
        ' 1.13     1999.09.08 Documented correct return codes of AcquireToFilename.
        '                     - No code changes -
        ' 1.12     1998.09.14 Added Fix32ToFloat, allow MSG_OPENDS triplet.
        '                     Added SetXferMech, XferMech.
        ' 1.11     1998.08.17 Added ToFix32, SetContrast, SetBrightness.
        '                     Modified TWAIN_ToFix32 to round away-from-zero.
        ' 1.09beta 1998.07.27 Reverted from 1.08 to 1.06 and worked forward again.
        ' 1.06     1997.08.21 correction to message hook, fixed 32-bit exports
        ' 1.05     1996.11.06 32-bit conversion
        ' 1.04     1995.05.03 added: WriteNativeToFile, WriteNativeToFilename,
        '                         FreeNative, SetHideUI, GetHideUI, SetCurrentUnits,
        '                         GetCurrentUnits, SetCurrentResolution, SetBitDepth,
        '                         SetCurrentPixelType, SetCapOneValue.
        ' 1.0a      1994.06.23 first alpha version
        ' 0.0      1994.05.11 created
        '
        ' EZTWAIN 1.x is not a product, and is not the work of any company involved
        ' in promoting or using the TWAIN standard.  This code is sample code,
        ' provided without charge, and you use it entirely at your own risk.
        ' No rights or ownership is claimed by the author, or by any company
        ' or organization.  There are no restrictions on use or (re)distribution.
        '
        ' Download from:    www.dosadi.com
        '
        ' Support contact:  support@dosadi.com
        '
     
        '--------- Basic calls
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_AcquireNative")> _
        Public Shared Function AcquireNative(ByVal hwndApp As IntPtr, ByVal wPixTypes As Int32) As IntPtr
        End Function
        ' The minimal use of EZTWAIN.DLL is to just call this routine, with 0 for
        ' both params.  EZTWAIN creates a window if hwndApp is 0.
        '
        ' Acquires a single image, from the currently selected Data Source, using
        ' Native-mode transfer. It waits until the source closes (if it's modal) or
        ' forces the source closed if not.  The return value is a handle to the
        ' acquired image.  Only one image can be acquired per call.
        '
        ' Under Windows, the return value is a global memory handle - applying
        ' GlobalLock to it will return a (huge) pointer to the DIB, which
        ' starts with a BITMAPINFOHEADER.
        ' NOTE: You are responsible for disposing of the returned DIB - these things
        ' can eat up your Windows memory fast!  See TWAIN_FreeNative below.
        '
        ' The image type can be restricted using the following masks.  A mask of 0
        ' means 'any pixel type is welcome'.
        ' Caution: You should not assume that the source will honor a pixel type
        ' restriction!  If you care, check the parameters of the DIB.
     
        Friend Const TWAIN_BW = &H1
        Friend Const TWAIN_GRAY = &H2
        Friend Const TWAIN_RGB = &H4
        Friend Const TWAIN_PALETTE = &H8
        Friend Const TWAIN_ANYTYPE = &H0
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_FreeNative")> _
        Public Shared Sub FreeNative(ByVal hdib As IntPtr)
        End Sub
        ' Release the memory allocated to a native format image, as returned by
        ' TWAIN_AcquireNative. (If you are coding in C or C++, this is just a call
        ' to GlobalFree.)
        ' If you use TWAIN_AcquireNative and don't free the returned image handle,
        ' it stays around taking up Windows (virtual) memory until your application
        ' terminates.  Memory required per square inch:
        '             1 bit B&W       8-bit grayscale     24-bit color
        ' 100 dpi      1.25KB              10KB               30KB
        ' 200 dpi        5KB               40KB              120KB
        ' 300 dpi      11.25KB             90KB              270KB
        ' 400 dpi       20KB              160KB              480KB
        '
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_AcquireToClipboard")> _
        Public Shared Function AcquireToClipboard(ByVal hwndApp As IntPtr, ByVal wPixTypes As Int32) As Int32
        End Function
        ' Like AcquireNative, but puts the resulting image, if any, into the system
        ' clipboard.  Under Windows, this will put a CF_DIB item in the clipboard
        ' if successful.  If this call fails, the clipboard is either empty or
        ' contains the old contents.
        ' A return value of 1 indicates success, 0 indicates failure.
        '
        ' Useful for environments like Visual Basic where it is hard to make direct
        ' use of a DIB handle.  In fact, TWAIN_AcquireToClipboard uses
        ' TWAIN_AcquireNative for all the hard work.
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_AcquireToFilename")> _
        Public Shared Function AcquireToFilename(ByVal hwndApp As IntPtr, ByVal sFile As String) As Int32
        End Function
        ' Acquire an image and write it to a .BMP (Windows Bitmap) file.
        ' The file name and path in pszFile are used.  If pszFile is NULL or
        ' points to an empty string, the user is prompted with a Save File dialog.
        ' Return values:
        ' 0 success
        ' -1 Acquire failed OR user cancelled File Save dialog
        ' -2 file open error (invalid path or name, or access denied)
        ' -3 (weird) unable to lock DIB - probably an invalid handle.
        ' -4 writing BMP data failed, possibly output device is full
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_SelectImageSource")> _
        Public Shared Function SelectImageSource(ByVal hwnd As IntPtr) As Int32
        End Function
        ' This is the routine to call when the user chooses the "Select Source..."
        ' menu command from your application's File menu.  Your app has one of
        ' these, right?  The TWAIN spec calls for this feature to be available in
        ' your user interface, preferably as described.
        ' Note: If only one TWAIN device is installed on a system, it is selected
        ' automatically, so there is no need for the user to do Select Source.
        ' You should not require your users to do Select Source before Acquire.
        '
        ' This function posts the Source Manager's Select Source dialog box.
        ' It returns after the user either OK's or CANCEL's that dialog.
        ' A return of 1 indicates OK, 0 indicates one of the following:
        '   a) The user cancelled the dialog
        '   b) The Source Manager found no data sources installed
        '   c) There was a failure before the Select Source dialog could be posted
        ' -- details --
        ' Only sources that can return images (that are in the DG_IMAGE group) are
        ' displayed.  The current default source will be highlighted initially.
        ' In the standard implementation of "Select Source...", your application
        ' doesn't need to do anything except make this one call.
        '
        ' If you want to be meticulous, disable your "Acquire" and "Select Source"
        ' menu items or buttons if TWAIN_IsAvailable() returns 0 - see below.
     
     
        '--------- Basic TWAIN Inquiries
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_IsAvailable")> _
        Public Shared Function IsAvailable() As Int32
        End Function
        ' Call this function any time to find out if TWAIN is installed on the
        ' system.  It takes a little time on the first call, after that it's fast,
        ' just testing a flag.  It returns 1 if the TWAIN Source Manager is
        ' installed & can be loaded, 0 otherwise. 
     
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_EasyVersion")> _
        Public Shared Function EasyVersion() As Int32
        End Function
        ' Returns the version number of EZTWAIN.DLL, multiplied by 100.
        ' So e.g. version 2.01 will return 201 from this call.
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_State")> _
        Public Shared Function State() As Int32
        End Function
        ' Returns the TWAIN Protocol State per the spec.
        Friend Const TWAIN_PRESESSION = 1
        Friend Const TWAIN_SM_LOADED = 2
        Friend Const TWAIN_SM_OPEN = 3
        Friend Const TWAIN_SOURCE_OPEN = 4
        Friend Const TWAIN_SOURCE_ENABLED = 5
        Friend Const TWAIN_TRANSFER_READY = 6
        Friend Const TWAIN_TRANSFERRING = 7
     
        '--------- DIB handling utilities ---------
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_DibDepth")> _
        Public Shared Function DibDepth(ByVal hdib As IntPtr) As Int32
        End Function
        ' Depth of DIB, in bits i.e. bits per pixel.
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_DibWidth")> _
        Public Shared Function DibWidth(ByVal hdib As IntPtr) As Int32
        End Function
        ' Width of DIB, in pixels (columns)
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_DibHeight")> _
        Public Shared Function DibHeight(ByVal hdib As IntPtr) As Int32
        End Function
        ' Height of DIB, in lines (rows)
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_DibNumColors")> _
        Public Shared Function DibNumColors(ByVal hdib As IntPtr) As Int32
        End Function
        ' Number of colors in color table of DIB
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_RowSize")> _
        Public Shared Function RowSize(ByVal hdib As IntPtr) As Int32
        End Function
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_ReadRow")> _
        Public Shared Sub ReadRow(ByVal hdib As IntPtr, ByVal nRow As Int32, ByRef prow As System.Byte)
        End Sub
        ' Read row n of the given DIB into buffer at prow.
        ' Caller is responsible for ensuring buffer is large enough.
        ' Row 0 is the *top* row of the image, as it would be displayed.
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_CreateDibPalette")> _
        Public Shared Function CreateDibPalette(ByVal hdib As IntPtr) As IntPtr
        End Function
        ' Create and return a logical palette to be used for drawing the DIB.
        ' For 1, 4, and 8-bit DIBs the palette contains the DIB color table.
        ' For 24-bit DIBs, a default halftone palette is returned.
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_DrawDibToDC")> _
        Public Shared Sub DrawDibToDC(ByVal hDC As IntPtr, ByVal dx As Int32, ByVal dy As Int32, ByVal w As Int32, ByVal h As Int32, ByVal hdib As IntPtr, ByVal sx As Int32, ByVal sy As Int32)
        End Sub
        ' Draws a DIB on a device context.
        ' You should call CreateDibPalette, select that palette
        ' into the DC, and do a RealizePalette(hDC) first.
     
        '--------- BMP file utilities
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_WriteNativeToFilename")> _
        Public Shared Function WriteNativeToFilename(ByVal hdib As IntPtr, ByVal sFile As String) As Int32
        End Function
        ' Writes a DIB handle to a .BMP file
        '
        ' hdib      = DIB handle, as returned by TWAIN_AcquireNative
        ' pszFile   = far pointer to NUL-terminated filename
        ' If pszFile is NULL or points to a null string, prompts the user
        ' for the filename with a standard file-save dialog.
        '
        ' Return values:
        '    0  success
        '   -1  user cancelled File Save dialog
        '   -2  file open error (invalid path or name, or access denied)
        '   -3  (weird) unable to lock DIB - probably an invalid handle.
        '   -4  writing BMP data failed, possibly output device is full
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_WriteNativeToFile")> _
        Public Shared Function WriteNativeToFile(ByVal hdib As IntPtr, ByVal fh As IntPtr) As Int32
        End Function
        ' Writes a DIB to a file in .BMP format.
        '
        ' hdib      = DIB handle, as returned by TWAIN_AcquireNative
        ' fh        = file handle, as returned by _open, _lopen or OpenFile
        '
        ' Return value as for TWAIN_WriteNativeToFilename
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_LoadNativeFromFilename")> _
        Public Shared Function LoadNativeFromFilename(ByVal sFile As String) As IntPtr
        End Function
        ' Load a .BMP file and return a DIB handle (as from AcquireNative.)
        ' Accepts a filename (including path & extension).
        ' If pszFile is NULL or points to a null string, the user is prompted.
        ' Returns a DIB handle if successful, otherwise NULL.
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_LoadNativeFromFile")> _
        Public Shared Function LoadNativeFromFile(ByVal fh As IntPtr) As IntPtr
        End Function
        ' Like LoadNativeFromFilename, but takes an already open file handle.
     
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_SetHideUI")> _
        Public Shared Sub SetHideUI(ByVal fHide As Int32)
        End Sub
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_GetHideUI")> _
        Public Shared Function GetHideUI() As Int32
        End Function
        ' These functions control the 'hide source user interface' flag.
        ' This flag is cleared initially, but if you set it non-zero, then when
        ' a source is enabled it will be asked to hide its user interface.
        ' Note that this is only a request - some sources will ignore it!
        ' This affects AcquireNative, AcquireToClipboard, and EnableSource.
        ' If the user interface is hidden, you will probably want to set at least
        ' some of the basic acquisition parameters yourself - see
        ' SetCurrentUnits, SetBitDepth, SetCurrentPixelType and
        ' SetCurrentResolution below.
     
        '--------- Application Registration
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_RegisterApp")> _
        Public Shared Sub RegisterApp(ByVal nMajorNum As Int32, ByVal nMinorNum As Int32, ByVal nLanguage As Int32, ByVal nCountry As Int32, ByVal lpszVersion As System.Text.StringBuilder, ByVal lpszMfg As System.Text.StringBuilder, ByVal lpszFamily As System.Text.StringBuilder)
     
        End Sub
        ' TWAIN_RegisterApp can be called *AS THE FIRST CALL*, to register the
        ' application. If this function is not called, the application is given a
        ' 'generic' registration by EZTWAIN.
        ' Registration only provides this information to the Source Manager and any
        ' sources you may open - it is used for debugging, and (frankly) by some
        ' sources to give special treatment to certain applications.
     
        '--------- Error Analysis and Reporting ------------------------------------
     
        '<DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_GetResultCode")> _
        'Public Shared Function GetResultCode() As Int32
        'End Function
        ' Return the result code (TWRC_xxx) from the last triplet sent to TWAIN
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_GetConditionCode")> _
        Public Shared Function GetConditionCode() As Int32
        End Function
        ' Return the condition code from the last triplet sent to TWAIN.
        ' (To be precise, from the last call to TWAIN_DS below)
        ' If a source is NOT open, return the condition code of the source manager.
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_ErrorBox")> _
        Public Shared Sub ErrorBox(ByVal sMsg As String)
        End Sub
        ' Post an error message dialog with an exclamation mark, OK button,
        ' and the title 'TWAIN Error'.
        ' pszMsg points to a null-terminated message string.
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_ReportLastError")> _
        Public Shared Sub ReportLastError(ByVal sMsg As String)
        End Sub
        ' Like TWAIN_ErrorBox, but if some details are available from
        ' TWAIN about the last failure, they are included in the message box.
     
     
        '--------- TWAIN State Control ------------------------------------
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_LoadSourceManager")> _
        Public Shared Function LoadSourceManager() As Int32
        End Function
        ' Finds and loads the Data Source Manager, TWAIN.DLL.
        ' If Source Manager is already loaded, does nothing and returns TRUE.
        ' This can fail if TWAIN.DLL is not installed (in the right place), or
        ' if the library cannot load for some reason (insufficient memory?) or
        ' if TWAIN.DLL has been corrupted.
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_OpenSourceManager")> _
        Public Shared Function OpenSourceManager(ByVal hwnd As IntPtr) As Int32
        End Function
        ' Opens the Data Source Manager, if not already open.
        ' If the Source Manager is already open, does nothing and returns TRUE.
        ' This call will fail if the Source Manager is not loaded.
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_OpenDefaultSource")> _
        Public Shared Function OpenDefaultSource() As Int32
        End Function
        ' This opens the source selected in the Select Source dialog.
        ' If a source is already open, does nothing and returns TRUE.
        ' Fails if the source manager is not loaded and open.
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_EnableSource")> _
        Public Shared Function EnableSource(ByVal hwnd As IntPtr) As Int32
        End Function
        ' Enables the open Data Source. This posts the source's user interface
        ' and allows image acquisition to begin.  If the source is already enabled,
        ' this call does nothing and returns TRUE.
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_DisableSource")> _
        Public Shared Function DisableSource() As Int32
        End Function
        ' Disables the open Data Source, if any.
        ' This closes the source's user interface.
        ' If there is not an enabled source, does nothing and returns TRUE.
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_CloseSource")> _
        Public Shared Function CloseSource() As Int32
        End Function
        ' Closes the open Data Source, if any.
        ' If the source is enabled, disables it first.
        ' If there is not an open source, does nothing and returns TRUE.
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_CloseSourceManager")> _
        Public Shared Function CloseSourceManager(ByVal hwnd As IntPtr) As Int32
        End Function
        ' Closes the Data Source Manager, if it is open.
        ' If a source is open, disables and closes it as needed.
        ' If the Source Manager is not open, does nothing and returns TRUE.
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_UnloadSourceManager")> _
        Public Shared Function UnloadSourceManager() As Int32
        End Function
        ' Unloads the Data Source Manager i.e. TWAIN.DLL - releasing
        ' any associated memory or resources.
        ' This call will fail if the Source Manager is open, otherwise
        ' it always succeeds and returns TRUE.
     
     
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_WaitForNativeXfer")> _
        Public Shared Function WaitForNativeXfer(ByVal hwnd As IntPtr) As IntPtr
        End Function
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_ModalEventLoop")> _
        Public Shared Sub ModalEventLoop()
        End Sub
        ' Process messages until termination, source disable, or image transfer.
     
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_EndXfer")> _
        Public Shared Function EndXfer() As Int32
        End Function
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_AbortAllPendingXfers")> _
        Public Shared Function AbortAllPendingXfers() As Int32
        End Function
     
     
        '--------- High-level Capability Negotiation Functions --------
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_NegotiateXferCount")> _
        Public Shared Function NegotiateXferCount(ByVal nXfers As Int32) As Int32
        End Function
        ' Negotiate with open Source the number of images application will accept.
        ' This is only allowed in State 4 (TWAIN_SOURCE_OPEN)
        ' nXfers = -1 means any number
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_NegotiatePixelTypes")> _
        Public Shared Function NegotiatePixelTypes(ByVal wPixTypes As Int32) As Int32
        End Function
        ' Negotiate with the source to restrict pixel types that can be acquired.
        ' This tries to restrict the source to a *set* of pixel types,
        ' See TWAIN_AcquireNative above for some mask constants.
        ' --> This is only allowed in State 4 (TWAIN_SOURCE_OPEN)
        ' A parameter of 0 (TWAIN_ANYTYPE) causes no negotiation & no restriction.
        ' You should not assume that the source will honor your restrictions, even
        ' if this call succeeds!
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_GetCurrentUnits")> _
        Public Shared Function GetCurrentUnits() As Int32
        End Function
        ' Ask the source what its current unit of measure is.
        ' If anything goes wrong, this function just returns TWUN_INCHES (0).
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_SetCurrentUnits")> _
        Public Shared Function SetCurrentUnits(ByVal nUnits As Int32) As Int32
        End Function
        ' Set the current unit of measure for the source.
        ' Unit of measure codes are in TWAIN.H, but TWUN_INCHES is 0.
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_GetBitDepth")> _
        Public Shared Function GetBitDepth() As Int32
        End Function
        ' Get the current bitdepth, which can depend on the current PixelType.
        ' Bit depth is per color channel e.g. 24-bit RGB has bit depth 8.
        ' If anything goes wrong, this function returns 0.
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_SetBitDepth")> _
        Public Shared Function SetBitDepth(ByVal nBits As Int32) As Int32
        End Function
        ' (Try to) set the current bitdepth (for the current pixel type).
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_GetPixelType")> _
        Public Shared Function GetPixelType() As Int32
        End Function
        ' Ask the source for the current pixel type.
        ' If anything goes wrong (it shouldn't), this function returns 0 (TWPT_BW).
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_SetCurrentPixelType")> _
        Public Shared Function SetCurrentPixelType(ByVal nPixType As Int32) As Int32
        End Function
        ' (Try to) set the current pixel type for acquisition.
        ' This is only allowed in State 4 (TWAIN_SOURCE_OPEN)
        ' The source may select this pixel type, but don't assume it will.
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_GetCurrentResolution")> _
        Public Shared Function GetCurrentResolution() As Double
        End Function
        ' Ask the source for the current (horizontal) resolution.
        ' Resolution is in dots per current unit! (See TWAIN_GetCurrentUnits above)
        ' If anything goes wrong (it shouldn't) this function returns 0.0
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_GetYResolution")> _
        Public Shared Function GetYResolution() As Double
        End Function
        ' Returns the current vertical resolution, in dots per *current unit*.
        ' In the event of failure, returns 0.0.
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_SetCurrentResolution")> _
        Public Shared Function SetCurrentResolution(ByVal dRes As Double) As Int32
        End Function
        ' (Try to) set the current resolution for acquisition.
        ' Resolution is in dots per current unit! (See TWAIN_GetCurrentUnits above)
        ' This is only allowed in State 4 (TWAIN_SOURCE_OPEN)
        ' Note: The source may select this resolution, but don't assume it will.
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_SetContrast")> _
        Public Shared Function SetContrast(ByVal dCon As Double) As Int32
        End Function
        ' (Try to) set the current contrast for acquisition.
        ' The TWAIN standard says that the range for this cap is -1000 ... +1000
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_SetBrightness")> _
        Public Shared Function SetBrightness(ByVal dBri As Double) As Int32
        End Function
        ' (Try to) set the current brightness for acquisition.
        ' The TWAIN standard says that the range for this cap is -1000 ... +1000
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_SetXferMech")> _
        Public Shared Function SetXferMech(ByVal mech As Int32) As Int32
        End Function
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_XferMech")> _
        Public Shared Function XferMech() As Int32
        End Function
        ' (Try to) set or get the transfer mode - one of the following:
        Friend Const XFERMECH_NATIVE = 0
        Friend Const XFERMECH_FILE = 1
        Friend Const XFERMECH_MEMORY = 2
     
        '--------- Low-level Capability Negotiation Functions --------
     
        ' Setting a capability is valid only in State 4 (TWAIN_SOURCE_OPEN)
        ' Getting a capability is valid in State 4 or any higher state.
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_SetCapOneValue")> _
        Public Shared Function SetCapOneValue(ByVal Cap As Int32, ByVal ItemType As Int32, ByVal ItemVal As Int32) As Int32
        End Function
        ' Do a DAT_CAPABILITY/MSG_SET, on capability 'Cap' (e.g. ICAP_PIXELTYPE,
        ' CAP_AUTOFEED, etc.) using a TW_ONEVALUE container with the given item type
        ' and value.  The item value must fit into 32 bits.
        ' Returns TRUE (1) if successful, FALSE (0) otherwise.
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_GetCapCurrent")> _
        Public Shared Function GetCapCurrent(ByVal Cap As Int32, ByVal ItemType As Int32, ByVal pVal As IntPtr) As Int32
        End Function
        ' Do a DAT_CAPABILITY/MSG_GETCURRENT on capability 'Cap'.
        ' Copy the current value out of the returned container into *pVal.
        ' If the operation fails (the source refuses the request), or if the
        ' container is not a ONEVALUE or ENUMERATION, or if the item type of the
        ' returned container is incompatible with the expected TWTY_ type in nType,
        ' returns FALSE.  If this function returns FALSE, *pVal is not touched.
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_ToFix32")> _
        Public Shared Function ToFix32(ByVal d As Double) As Int32
        End Function
        ' Convert a floating-point value to a 32-bit TW_FIX32 value that can be passed
        ' to e.g. TWAIN_SetCapOneValue
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_Fix32ToFloat")> _
        Public Shared Function Fix32ToFloat(ByVal nfix As Int32) As Double
        End Function
        ' Convert a TW_FIX32 value (as returned from some capability inquiries)
        ' to a double (floating point) value.
     
        '--------- Lowest-level functions for TWAIN protocol --------
     
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_DS")> _
        Public Shared Function DS(ByVal DG As Int32, ByVal DAT As Int32, ByVal MSG As Int32, ByVal pData As IntPtr) As Int32
        End Function
        ' Passes the triplet (DG, DAT, MSG, pData) to the open data source if any.
        ' Returns 1 (TRUE) if the result code is TWRC_SUCCESS, 0 (FALSE) otherwise.
        ' The last result code can be retrieved with TWAIN_GetResultCode(), and the corresponding
        ' condition code can be retrieved with TWAIN_GetConditionCode().
        ' If no source is open this call will fail, result code TWRC_FAILURE, condition code TWCC_NODS.
     
        <DllImport("eztw32.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True, SetLastError:=False, EntryPoint:="TWAIN_Mgr")> _
        Public Shared Function Mgr(ByVal DG As Int32, ByVal DAT As Int32, ByVal MSG As Int32, ByVal pData As IntPtr) As Int32
        End Function
        ' Passes a triplet to the Data Source Manager (DSM).
        ' Returns 1 (TRUE) if the result code is TWRC_SUCCESS, 0 (FALSE) otherwise.
        ' The last result code can be retrieved with TWAIN_GetResultCode(), and the corresponding
        ' condition code can be retrieved with TWAIN_GetConditionCode().
        ' If the Source Manager is not open, this call will fail, and set the result code to TWRC_FAILURE,
        ' with a condition code of TWCC_SEQERROR (triplet out of sequence).
    #End Region
     
    #Region "GestScan"
     
        Dim THdl As Int32 = 0
     
        Public Sub New(ByVal Hdl As Int32)
     
            THdl = Hdl
     
        End Sub
     
        ''' <summary>
        ''' récupération du résultat du scan
        ''' </summary>
        Public Function Scan(ByVal Resolution As Integer, ByVal Chemin As String) As Boolean
     
            Try
                If State() < 4 Then
                    OpenDefaultSource()
                End If
     
                If State() < 4 Then
                    MsgBox("Impossible de paramêtrer le scanner", MsgBoxStyle.Exclamation)
                Else
                    'parametres du scanner
                    SetCurrentUnits(0) 'DPI
                    SetCurrentResolution(Resolution) 'en points par pouces
                    SetCurrentPixelType(2) ' Scan format 0 = B&W, 1 Grey, 2 RGB
                    SetBitDepth(8) ' Bit Depth 1, 2, 4, 8 but depends on Pixeltype
                    SetHideUI(1)
                End If
     
                'scan du document
                AcquireToFilename(THdl, Chemin)
     
            Catch ex As Exception
                Return False
                MsgBox(ex.Message)
            End Try
     
            Return True
     
        End Function
     
        Public Sub ChoixScan(ByVal Resolution As Integer)
     
            Try
                Dim Ret As Long = 0
                'Fermeture de la source du scan
                CloseSource()
                LoadSourceManager()
                OpenSourceManager(THdl)
     
                Ret = SelectImageSource(THdl)
                If Ret = 1 Then
                    Ret = OpenDefaultSource()
                End If
     
                If State() <> 4 Then
                    MsgBox("Impossible de paramêtrer le scanner", MsgBoxStyle.Exclamation)
                Else
                    'parametres du scanner
                    SetCurrentUnits(0) 'DPI
                    SetCurrentResolution(Resolution) 'en points par pouces
                    SetCurrentPixelType(2) ' Scan format 0 = B&W, 1 Grey, 2 RGB
                    SetBitDepth(8) ' Bit Depth 1, 2, 4, 8 but depends on Pixeltype
                    SetHideUI(1)
                End If
     
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
     
        End Sub
     
    #End Region
     
    End Class


    Merci à tous.

  10. #10
    Membre habitué
    Inscrit en
    Novembre 2006
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 257
    Points : 153
    Points
    153
    Par défaut Bonjour à tous!
    Je relance le sujet (VBA sur Access, il n'y a pas beaucoup de différence))car je n'arrive pas à faire choisir le Scanner par défaut quand il y en a plusieurs (un à plat et un à défilement) installés. Aucun ne se lance alors que le programme fonctionnait.
    Public Function AkTwain(akRes As Long, akType As Long, akChem, akdCon As Double)
    Dim hDIB As Long
    Dim hPal As Long
    Dim nPixTypes As Long
    Dim FileName As String
    Dim taskId As Integer
    Dim shellpar As String
    If Forms!Verrou!K2.Tag = "a" Then
    TWAIN_SetHideUI (0)
    Else
    TWAIN_SetHideUI (1)
    End If
    If (hPal <> 0) Then
    hPal = 0
    End If
    If (hDIB <> 0) Then
    TWAIN_FreeNative (hDIB)
    hDIB = 0
    End If
    If TWAIN_OpenDefaultSource() = 0 Then TWAIN_SelectImageSource (hDIB)
    If TWAIN_OpenDefaultSource() <> 0 Then
    TWAIN_SetCurrentResolution (akRes)
    TWAIN_NegotiatePixelTypes (akType)
    TWAIN_SetContrast (akdCon)
    hDIB = TWAIN_AcquireNative(0, 0)
    If Forms!Verrou!K2.Tag = "a" Then
    SendKeys "{Right}"
    Sleep (1000)
    SendKeys "{Enter}", False
    End If
    If hDIB <> 0 Then
    hPal = TWAIN_CreateDibPalette(hDIB)
    Else
    MsgBox "Aucune image n'a été scannée ou le transfert vers le fichier n'a pu se faire."
    Exit Function
    End If
    End If
    If hDIB <> 0 Then
    If TWAIN_WriteNativeToFilename(hDIB, "c:\J.bmp") < -1 Then
    MsgBox "Erreur d'écriture du fichier - Le dossier a-t-il été créé??"
    End If
    End If
    End Function

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de migration vers .NET 4.5
    Par abasourdix dans le forum ASP.NET
    Réponses: 4
    Dernier message: 06/02/2013, 11h52
  2. Problème de perfs après simple migration en .Net 2.0
    Par Ideal_Du_Gazeau dans le forum C#
    Réponses: 0
    Dernier message: 23/02/2010, 18h29
  3. Migration VB.NET - Problème de suppression de fichiers
    Par Satare dans le forum Windows Forms
    Réponses: 2
    Dernier message: 21/05/2008, 16h55
  4. problème de class en C++ .Net
    Par swo.line dans le forum C++
    Réponses: 6
    Dernier message: 17/04/2008, 22h48
  5. Problème de migration asp.net 1.1 -> asp.net 2.0
    Par Avatarr dans le forum ASP.NET
    Réponses: 1
    Dernier message: 11/12/2007, 10h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo