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

 Delphi Discussion :

[D7] scanner avec la bibliothèque de fonctions WIAAUT.DLL


Sujet :

Delphi

  1. #1
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut [D7] scanner avec la bibliothèque de fonctions WIAAUT.DLL
    Bonjour,

    je veux scanner des images avec mon imprimante multi fonction.
    J'y arrive avec :

    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
    { ==================================================================== }
    Uses WIA_TLB.Pas ;
     
    procedure TF_Princ.Btn_ScanClick(Sender: TObject);
    // Scan d'une image
    Const
      wiaFormatBMP = '{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}' ;
    Var
      Mess : String ;
      Fichier : String ;
      CmnDlg : ICommonDialog ;
      connectedDev : IDevice ;
      Image : IImageFile ;
     
    begin
      Fichier := 'Tmp.bmp' ;             // Provisoirement
      cmnDlg := CoCommonDialog.Create;
      image:= cmnDlg.ShowAcquireImage(ScannerDeviceType,
                                      UnspecifiedIntent,
                                      MaximizeQuality,
                                      wiaFormatBMP,
                                      False,
                                      True,
                                      true);
      if Image <> nil then
        Begin
          If FileExists(Fichier) Then DeleteFile(Fichier) ;
          image.SaveFile(Fichier);
          Image1.Picture.Bitmap.LoadFromFile(Fichier);
        End
      Else
        MessageDlg('Erreur d''acquisition de l''image', mtInformation, [mbOk], 0) ;
    end;
    { ==================================================================== }
    Mais j'aimerais pouvoir récupérer et fixer les caractéristiques du scan (la résolution, le nombre de pixels par bit,, ...).

    Je ne trouve pas la ou les fonctions qui permettent cela.

    D'autre part, malgré le fait que j'ai mis à False le cinquième paramètre de ShowAcquireImage, la boite de choix du scanner s'affiche toujours ?
    je voudrais l'éviter, pouvoir le choisir par programme et le stocker pour la session suivante.

    j'ai vu aussi que l'on pouvait utiliser ComObj et CreateOleObject comme ici pour afficher la boite d'impression des images :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.Button1Click(Sender: TObject);
    var
      CommDlg: OleVariant;
    begin
      CommDlg := CreateOleObject('WIA.CommonDialog');
      CommDlg.ShowPhotoPrintingWizard('d:\Image.jpg');
    end;
    Est ce que c'est mieux et qu'il y a plus de possibilités qu'avec WIA_TLB.Pas ?

    Merci

    A+
    Charly

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    En même temps, ce sont des fonctions de ICommonDialog donc c'est normal que cela affiche un Dialog

    Cependant AlwaysSelectDevice à True, pour ne pas afficher la sélection, ne faut-il pas un périphérique d'acquision par défaut ou déjà selectionné par un précédent appel



    Utilise IWiaItem et IWiaDataTransfer
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Ok, merci, je vais essayer

    A+
    Charly

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 426
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 426
    Points : 1 326
    Points
    1 326
    Par défaut
    Bonjour à toutes et à tous,

    @ Charly910, j'utilise une autre procédure en D6 qui permet de choisir le scanner et ses réglages, c'est pour cette raison que je n'avais jamais eu le cas d'une photo inversée.



    J'ai juste ajouté une procédure pour réduire en % l'image finale en .bmp.

    Le zip contient les unités.

    Tu pourras peut être t'en inspiré

    @+,

    cincap

    Project1.zip

  5. #5
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Merci Cincap,

    Avec ton exemple j'ai une violation d'accès sur la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TWAIN_SelectImageSource(0); //Affichage de la boite de dialogue de sélection de la source
    C'est le zéro qu'il ne digère pas !

    J'ai déjà utilisé DelphiTwain, mais jamais ce Twain là. Je voulais essayer avec WIA

    @ShaiLeTroll : avec IWiaItem et IWiaDataTransfer je n'arrive à rien (je ne sais pas comment faire) et je n'ai rien trouvé sur le net avec Delphi !

    A+
    Charly

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Essaye ce code DelphiWIATakePicture qui est en WIA 1.0
    Note qu'en WIA 1.0 et WIA 2.0, les noms des interfaces sont différentes, l'utilisation est ressemblante mais cela rend confus l'utilisation de l'un ou l'autre, beaucoup confondent les deux et mélangent le code des deux versions qui ne sont pas compatibles.
    Faut importer WIA 2.0 si tu n'as que lui et la classe que tu cherches est IItemDisp\IItem ... oui comme je disais les noms ne sont pas les mêmes ce qui complique la chose
    WIA 1.0 avait pour but de remplacer TWAIN, logique de vouloir utiliser WIA.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    N'ayant aucun périphérique, je ne peux pas tester mais en me basant sur les exemples VB, ça doit être cohérent :
    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
     
    procedure TForm1.Button1Click(Sender: TObject);
    const
      wiaCommandTakePicture = '{AF933CAC-ACAD-11D2-A093-00C04F72DC3C}'; // <a href="https://docs.microsoft.com/en-us/previous-versions/windows/desktop/wiaaut/-wiaaut-consts-commandid" target="_blank">https://docs.microsoft.com/en-us/pre...nsts-commandid</a>
      wiaFormatBMP = '{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}'; // <a href="https://docs.microsoft.com/en-us/previous-versions/windows/desktop/wiaaut/-wiaaut-consts-formatid" target="_blank">https://docs.microsoft.com/en-us/pre...onsts-formatid</a>
     
      function GetSelectedDevice(ADeviceManager: IDeviceManager): IDevice;
      var
        I, K: Integer;
        S: string;
      begin
        for I := 1 to ADeviceManager.DeviceInfos.Count do
        begin
          if ADeviceManager.DeviceInfos.Item[I].type_ = ScannerDeviceType then
          begin
            S := '';
            for K := 1 to ADeviceManager.DeviceInfos.Item[I].Properties.Count do
            begin
              if ADeviceManager.DeviceInfos.Item[I].Properties.Item[K].type_ = StringPropertyType then
                S := S + ADeviceManager.DeviceInfos.Item[I].Properties.Item[K].Name + ':' +  ADeviceManager.DeviceInfos.Item[I].Properties.Item[K].Get_Value + ' ';
            end;
     
            if MessageDlg(S, mtConfirmation, mbYesNo, 0) = mrYes then
              Exit(ADeviceManager.DeviceInfos.Item[I].Connect());
          end;
        end;
        Abort;
      end;
     
     
    var
      DeviceManager: IDeviceManager;
      DeviceScanner: IDevice;
      CommandResult: IItem;
      OleImage: OleVariant;
      AImage: IImageFile;
    begin
      DeviceManager := CreateOleObject('WIA.DeviceManager') as IDeviceManager;
      DeviceScanner := GetSelectedDevice(DeviceManager);
      if DeviceScanner.type_ = ScannerDeviceType then
      begin
        CommandResult := DeviceScanner.ExecuteCommand(wiaCommandTakePicture);
        OleImage := CommandResult.Transfer(wiaFormatBMP);
        if VarIsType(OleImage, varDispatch) and Supports(OleImage, IImageFile, AImage) then
          AImage.SaveFile(ExtractFilePath(Application.ExeName) + FormatDateTime('YYYYMMDD_HHNNSSZZZ.', Now()) + AImage.FileExtension);
      end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Merci Shai, je teste.

    @Cincap : en remplaçant les 0 de tes procédures par Handle, ça marche.

    A+
    Charly

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    N'ayant pas testé, j'ai un doute sur varDispatch qui peut être VarUnknown, respectivement pour pointer sur une IDispatch ou IUnknown (IInterface)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  10. #10
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    J'ai modifié un peu le code pour D7 :

    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
    { ======================================================================= }
    procedure TF_Princ.Button1Click(Sender: TObject);
    const
      wiaCommandTakePicture = '{AF933CAC-ACAD-11D2-A093-00C04F72DC3C}'; // <a href="https://docs.microsoft.com/en-us/previous-versions/windows/desktop/wiaaut/-wiaaut-consts-commandid" target="_blank">https://docs.microsoft.com/en-us/pre...nsts-commandid</a>
      wiaFormatBMP = '{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}'; // <a href="https://docs.microsoft.com/en-us/previous-versions/windows/desktop/wiaaut/-wiaaut-consts-formatid" target="_blank">https://docs.microsoft.com/en-us/pre...onsts-formatid</a>
     
      function GetSelectedDevice(ADeviceManager: IDeviceManager): IDevice;
      var
        I, K: Integer;
        S: string;
      begin
        for I := 1 to ADeviceManager.DeviceInfos.Count do
        begin
          if ADeviceManager.DeviceInfos.Item[I].type_ = ScannerDeviceType then
          begin
            S := '';
            for K := 1 to ADeviceManager.DeviceInfos.Item[I].Properties.Count do
            begin
              if ADeviceManager.DeviceInfos.Item[I].Properties.Item[K].type_ = StringPropertyType then
                S := S + Chr(13)+ADeviceManager.DeviceInfos.Item[I].Properties.Item[K].Name + ':' +  ADeviceManager.DeviceInfos.Item[I].Properties.Item[K].Get_Value + ' ';
            end;
            if MessageDlg(S, mtConfirmation, [mbYes, mbNo], 0) = mrYes then
              Begin
                ADeviceManager.DeviceInfos.Item[I].Connect();
    //          Exit(ADeviceManager.DeviceInfos.Item[I].Connect());     // pas de Exit() en D7
                Exit;   // avec ce Exit j'ai une violation d'accès ...
              End ;
          end;
        end;
        Abort;
      end;
     
     
    var
      DeviceManager: IDeviceManager;
      DeviceScanner: IDevice;
      CommandResult: IItem;
      OleImage: OleVariant;
      AImage: IImageFile;
      Fichier : String ;
    begin
      DeviceManager := CreateOleObject('WIA.DeviceManager') as IDeviceManager;
      DeviceScanner := GetSelectedDevice(DeviceManager);
      if DeviceScanner.type_ = ScannerDeviceType then
      begin
        CommandResult := DeviceScanner.ExecuteCommand(wiaCommandTakePicture);
        OleImage := CommandResult.Transfer(wiaFormatBMP);
        if VarIsType(OleImage, varDispatch) and Supports(OleImage, IImageFile, AImage) then
          Begin
            Fichier := ExtractFilePath(Application.ExeName) + FormatDateTime('YYYYMMDD_HHNNSSZZZ.', Now()) + AImage.FileExtension;
            If FileExists(Fichier) Then DeleteFile(Fichier) ;
            AImage.SaveFile(Fichier);
            Image1.Picture.Bitmap.LoadFromFile(Fichier) ;
          End ;
      end;
    end;
    le Exit(...) me pose problème j'ai mis Exit ; mais alors j'ai un acess violation ?

    Sinon je récupère bien les caractéristiques de mes 2 scanners

    A+
    Charly

  11. #11
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Ne peut-on remplacer ce Exit(ADeviceManager.DeviceInfos.Item[I].Connect()) par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Result := ADeviceManager.DeviceInfos.Item[I].Connect();
    Break;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  12. #12
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Ah oui Tourlourou tu sa raison !!

    A+
    Charly

  13. #13
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Ah oui D7 c'est vrai !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            if MessageDlg(S, mtConfirmation, [mbYes, mbNo], 0) = mrYes then
            begin
              Result := ADeviceManager.DeviceInfos.Item[I].Connect();
              Exit;
            end;
    Pas de Break, sinon cela va lancer le Abort qui est là pour gérer la non sélection
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  14. #14
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    ça fonctionne mais la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        CommandResult := DeviceScanner.ExecuteCommand(wiaCommandTakePicture);
    me renvoie l'erreur : 'Non implémenté' ?

    A+
    Charly

  15. #15
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Dans les exemples Microsoft pointés plus haut, il y a semble-t-il le moyen de lister les commandes :
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 1 To itm.Commands.Count
        s = s & itm.Commands(i).Name & ": " & itm.Commands(i).Description & vbCrLf
    Next
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  16. #16
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    j'ai pris une commande au pif vu le nom, essaye wiaCommandChangeDocument


    Enumère les actions un code du genre de GetSelectedDevice, soit un GetSelectedCommand

    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
      function GetSelectedCommand(ADevice: IDevice): string;
      var
        I: Integer;
        S: string;
      begin
        for I := 1 to ADevice.Commands.Count do
        begin
          S := ADevice.Commands.Item[I].Name + ':' +  ADevice.Commands.Item[I].Description;
     
          if MessageDlg(S, mtConfirmation, [mbYes, mbNo], 0) = mrYes then
          begin
            Result := ADevice.Commands.Item[I].CommandID;   // wiaCommandTakePicture ??? wiaCommandChangeDocument ????
            Exit;
          end;
        end;
        Abort;
      end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CommandResult := DeviceScanner.ExecuteCommand(GetSelectedCommand(DeviceScanner));
    Dans ton code, tu devras avoir un écran de configuration initial pour mémoriser les DeviceID, CommandID voire même les Formats disponible, les stocker dans la base de données ou un support de config pour les utiliser au moment du Scan
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  17. #17
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 426
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 426
    Points : 1 326
    Points
    1 326
    Par défaut
    Bonjour à toutes et à tous,

    @ Charly910, désolé pour ce bug, le code est une suite de mes applications en D3 et refaite pour D6 sous Windows 11 64 bits avec imprimante
    /Scanner Hp Photosmart 5520 et tout fonctionne correctement.

    Maintenant à nouveau suivant le système Windows, imprimante et Delphi il y a toujours un petit bug.

    Bonne journée.

    @+,

    cincap

  18. #18
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Bonjour et merci pour ce nouveau code,

    j'ai ajouté un Memo et des showmessages pour suivre le déroulement :

    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
    { ======================================================================= }
    procedure TF_Princ.Button1Click(Sender: TObject);
    const
      wiaCommandTakePicture = '{AF933CAC-ACAD-11D2-A093-00C04F72DC3C}'; // <a href="https://docs.microsoft.com/en-us/previous-versions/windows/desktop/wiaaut/-wiaaut-consts-commandid" target="_blank">https://docs.microsoft.com/en-us/pre...nsts-commandid</a>
      wiaFormatBMP = '{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}'; // <a href="https://docs.microsoft.com/en-us/previous-versions/windows/desktop/wiaaut/-wiaaut-consts-formatid" target="_blank">https://docs.microsoft.com/en-us/pre...onsts-formatid</a>
     
      function GetSelectedDevice(ADeviceManager: IDeviceManager): IDevice;
      var
        I, K : Integer;
        S    : string;
        S1   : string;
      begin
        for I := 1 to ADeviceManager.DeviceInfos.Count do
        begin
          Memo1.Lines.Add(' .............................  ') ;
          if ADeviceManager.DeviceInfos.Item[I].type_ = ScannerDeviceType then
          begin
            S := '';
            for K := 1 to ADeviceManager.DeviceInfos.Item[I].Properties.Count do
            begin
              if ADeviceManager.DeviceInfos.Item[I].Properties.Item[K].type_ = StringPropertyType then
                Begin
                S1 := ADeviceManager.DeviceInfos.Item[I].Properties.Item[K].Name + ':' +
                      ADeviceManager.DeviceInfos.Item[I].Properties.Item[K].Get_Value + ' ';
                S := S + Chr(13)+ S1;
                Memo1.Lines.Add(S1)
                End ;
            end;
            if MessageDlg(S, mtConfirmation, [mbYes, mbNo], 0) = mrYes then
              Begin
                Result := ADeviceManager.DeviceInfos.Item[I].Connect();
                Exit ;
              End ;
          end;
        end;
        Abort;
      end;
     
    function GetSelectedCommand(ADevice: IDevice): string;
      var
        I    : Integer;
        S    : string;
        S1   : string;
      begin
        for I := 1 to ADevice.Commands.Count do
        begin
          S := ADevice.Commands.Item[I].Name + ':' +  ADevice.Commands.Item[I].Description  ;
          Memo1.Lines.Add(S) ;
          if MessageDlg(S, mtConfirmation, [mbYes, mbNo], 0) = mrYes then
          begin
            Result := ADevice.Commands.Item[I].CommandID;   // wiaCommandTakePicture ??? wiaCommandChangeDocument ????
            Exit;
          end;
        end;
        Abort;
      end;
     
     
    var
      DeviceManager: IDeviceManager;
      DeviceScanner: IDevice;
      CommandResult: IItem;
      OleImage: OleVariant;
      AImage: IImageFile;
      Fichier : String ;
    begin
      Memo1.Clear ;
      DeviceManager := CreateOleObject('WIA.DeviceManager') as IDeviceManager;
      DeviceScanner := GetSelectedDevice(DeviceManager);
      Memo1.Lines.Add(' ---------------------------------- ') ;
      if DeviceScanner.type_ = ScannerDeviceType then
      begin
        ShowMessage('1') ;
    //    CommandResult := DeviceScanner.ExecuteCommand(wiaCommandTakePicture);
        CommandResult := DeviceScanner.ExecuteCommand(GetSelectedCommand(DeviceScanner));
        Memo1.Lines.Add(' ================================= ') ;
        ShowMessage('2') ;
        OleImage := CommandResult.Transfer(wiaFormatBMP);
        ShowMessage('3') ;
    //    if VarIsType(OleImage, varDispatch) and Supports(OleImage, IImageFile, AImage) then
        if VarIsType(OleImage, VarUnknown) and Supports(OleImage, IImageFile, AImage) then
          Begin
            ShowMessage('4') ;
            Fichier := ExtractFilePath(Application.ExeName) + FormatDateTime('YYYYMMDD_HHNNSSZZZ.', Now()) + AImage.FileExtension;
            If FileExists(Fichier) Then DeleteFile(Fichier) ;
            AImage.SaveFile(Fichier);
            Image1.Picture.Bitmap.LoadFromFile(Fichier) ;
          End
        Else
          ShowMessage('0') ;
      end;
    end;
    Je réponds non au premier Device et j'obtiens dans Memo1 :

    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
     .............................  
    Unique Device ID:{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}\0001 
    Manufacturer:Microsoft 
    Description:Périphérique de numérisation WSD 
    Port:urn:uuid:1c852a4d-b800-1f08-abcd-5cb90154eebb/http://1c852a4d-b800-1f08-abcd-5cb90154eebb/ScanService 
    Name:HP54EEBB (HP ENVY 4500 series) 
    Server:local 
    Remote Device ID: 
    UI Class ID:{00000000-0000-0000-0000-000000000000} 
    BaudRate: 
    WIA Version:2.0 
    Driver Version:10.0.19041.1 
    PnP ID String:\\?\swd#dafwsdprovider#urn:uuid:1c852a4d-b800-1f08-abcd-5cb90154eebb#http:##1c852a4d-b800-1f08-abcd-5cb90154eebb#scanservice#{6bdd1fc6-810f-11d0-bec7-08002be2092f} 
     .............................  
    Unique Device ID:{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}\0000 
    Manufacturer:Hewlett-Packard 
    Description:HP ENVY 4500 series (USB) 
    Port:\\.\Usbscan0 
    Name:HP ENVY 4500 series (USB) 
    Server:local 
    Remote Device ID: 
    UI Class ID:{4DB1AD10-3391-11D2-9A33-00C04FA36145} 
    BaudRate: 
    WIA Version:2.0 
    Driver Version:30.0.411.0 
    PnP ID String:\\?\usb#vid_03f0&pid_c511&mi_00#6&248ab5c9&2&0000#{6bdd1fc6-810f-11d0-bec7-08002be2092f} 
     ---------------------------------- 
    Build device tree:Build device tree
    je clique sur Oui dans "Build device tree" et j'ai à nouveau "Non implémenté" et je ne passe pas dans le ShowMessage('2') .

    Je patauge !

    A+
    Charly

  19. #19
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    {6bdd1fc6-810f-11d0-bec7-08002be2092f} = GUID_DEVINTERFACE_IMAGE

    "Build device tree", faudrait regarder à quoi correspond CommandID

    Et faudrait laisser toutes les commandes s'afficher, il ne faut pas répondre oui à "Build device tree" mais à une commande qui a une description plus proche de Take Picture ou Load Document ...


    il ne faut pas négliger les messages d'erreur : wia executecommand not implemented, il faut éplucher les réponses, c'est ça le vrai travail du développeur, trouver l'info.

    Par exemple, il semble que l'on puisse se passer du ExecuteCommand et aller directement sur Transfer en définissant WIA_IPS_DOCUMENT_HANDLING_SELECT à FEEDER sauf que selon la doc, ce n'est plus possible de Seven, ce WIA semble avoir subi beaucoup de révision selon l'OS et un code pouvant fonctionner avant ne fonctionne plus après, cela ne donne pas trop envie d'utiliser cette interface.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  20. #20
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Oui merci Shai,

    je me demande si je ne vais pas me rabattre sur Twain qui fonctionne à merveille et plus rapidement que WIA par exemple pour la sélection du Device

    Je fais quelques tests supplémentaires. Le problème c'est que si je réponds Non, plus aucune autre commande de s'affiche et qu'il ne sa passe plus rien !

    A+
    Charly

Discussions similaires

  1. Recherche une fonction avec sa bibliothèque
    Par SandyLds dans le forum C++
    Réponses: 2
    Dernier message: 13/01/2017, 18h07
  2. multi acquisition avec 2 scanner meme modele wiaaut.dll
    Par kiki50000 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 10/03/2009, 13h57
  3. Réponses: 2
    Dernier message: 26/11/2008, 22h12
  4. Réponses: 6
    Dernier message: 24/02/2005, 09h44
  5. Problème avec les touches CTRL & FONCTIONS
    Par bidule999 dans le forum Applications et environnements graphiques
    Réponses: 1
    Dernier message: 03/12/2004, 09h52

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