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

EDI Delphi Discussion :

Delphi 10.3.3 - problème d'impression


Sujet :

EDI Delphi

  1. #1
    Membre confirmé
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Juillet 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2010
    Messages : 88
    Par défaut Delphi 10.3.3 - problème d'impression
    Bonjour
    Je rencontre un problème d'impression suite à un passage de Delphi XE6 à Delphi 10.3.3
    Environnement de production : application fonctionnant en client/serveur sur serveur Citrix (Windows 2016 standard - 64 bits)

    Tous les états sont réalisés avec QuickReport (version 6 Pro Build 4.25) : 3 possibilités pour imprimer un état : Prévisualisation - Impression directe - Génération d'un PDF (via Gnostice)
    Dans l'ancienne version compliée en 32 bits avec Delphi XE6 aucun souci tout fonctionne nickel

    Depuis le passage a Delphi 10.3.3 et compilation de 64 bits je rencontre un sévère problème d'impression :
    Cas Prévisualisation : si je clique sur le bouton impression directe, soit la page imprimée sort complètement blanche, soit j'ai un un plantage du programme
    Cas Prévisualisation: si je clique sur le bouton configuration de l'imprimante, je valide simplement par OK et j'imprime , l'impression sort normalement
    Cas Impression directe : plantage du programme
    Cas Génération du PDF : plantage du programme

    Cas particulier : Un utilisateur sous Citrix (comme tous les autres) mais qui a une imprimante physique reliée à son pc ainsi que toutes les autres imprimantes réseau

    Je me suis donc mis à la recherche de la source du plantage en essayant différentes configurations, sachant que sur ma machine de développement (Windows 10 64 bits sans imprimante locale mais avec des imprimantes réseau configurées) aucun souci d'impression

    Cas 1 : lancement de l'impression à partir de Delphi, compilé en 64 bits avec Delphi 10.3.3, sur la machine de développement sans imprimante locale mais avec les imprimantes réseaux => ça fonctionne
    Cas 2 : lancement de l'impression à partir l'exécutable, compilé en 64 bits avec Delphi 10.3.3, sur la machine de développement sans imprimante locale mais avec les imprimantes réseaux => ça fonctionne
    Cas 3 : lancement de l'impression à partir l'exécutable sur la machine physique Citrix (idem cas 2), compilé en 64 bits avec Delphi 10.3.3, sur le serveur Citrix sans imprimante locale mais avec les imprimantes réseaux => ça fonctionne
    Cas 4 : lancement de l'impression à partir l'exécutable sur la machine virtuelle Ciitrix, compilé en 64 bits avec Delphi 10.3.3, sur le serveur Citrix sans imprimante locale mais avec les imprimantes réseaux => ça ne fonctionne pas
    Cas 5 : lancement de l'impression à partir l'exécutable sur la machine virtuelle Ciitrix, compilé en 32 bits avec Delphi 10.3.3, sur le serveur Citrix sans imprimante locale mais avec les imprimantes réseaux => ça ne fonctionne pas
    Cas 6 : lancement de l'impression à partir l'exécutable sur la machine virtuelle Ciitrix, compilé en 32 bits avec Delphi XE6, sur le serveur Citrix sans imprimante locale mais avec les imprimantes réseaux => ça fonctionne

    Quid : le problème semble se situer au niveau de Delphi 10.3.3 par rapport à Delphi XE6

    Si quelqu'un a une piste de recherche, je suis preneur !!!!

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 096
    Par défaut
    Bonne Année Mr Banane !


    Comment sont reconnus les imprimantes sur Citrix ?

    leur nom complet, dans l'environnement CITRIX que j'ai connu, en fait CITRIX montait les imprimantes déclarées localement sur le PC Client, certaines liées en IP pour le format A4 mais en USB ou IP pour les formats A6 ou des imprimantes à rouleaux ZEBRA pour des étiquettes de format variée (plusieurs imprimantes, chaque un format papier différent, le programme faisait l'aiguillage de l'impression)

    J'avais ainsi un nom complet d'imprimante de la forme "printer (de computer) dans la session x" ou "client/computer/printer".

    Pour gérer cela, l'application Delphi en CITRIX demandait à l'utilisateur de choisir son imprimante mais de retirer la décoration CITRIX, c'était normalement des techniciens de maintenance de l'architecture qui devait aider les utilisateurs mais ils n'ont jamais été fichu du comprendre la différence entre le nom court de l'imprimante (tel qu'en local) et le nom décore par CITRIX ... les utilisateurs lambda eux avaient fini par comprendre.

    J'avais une fonction qui retrouvait le nom de l'imprimante décoré à partir du nom court
    Problème, CITRIX devenait fou parfois, on pouvait voir, plusieurs fois la même imprimante des anciennes sessions de l'utilisateur, pire on pouvait voir les imprimantes des sessions des autres utilisateurs, soit des centaines soit des milliers d'alias d'imprimante locale monté sur le client CITRIX.



    J'ai noté aussi pour le mode Preview, en ReportBuilder et non QuickReport, une différence de comportement selon le client, un problème de résolution et du zoom Windows en conflit sur certains postes.

    Mode complet ou SeamLess :
    Fonction qui détectait le mode CITRIX à l'époque de Server 2008 et Server 2012, avec comme client Citrix en 2008 Citrix Online Plug-in et 2012 Citrix Receiver
    La ferme 2012 était en XenApp (différente de l'ancienne ferme 2008)

    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
    //------------------------------------------------------------------------------
    class function TSliteModuleTool.IsCitrix(ATransparentSeamlessModeActivated: PBoolean = nil; AIsRemotedSessionWithoutCitrix: PBoolean = nil): Boolean;
    const
      WND_HOOK_CLASSNAME = 'Seamless Host Agent - Active Accessibility Hooking Window';
      WND_HOOK_CLASSTEXT = 'Agent de transparence hôte - Fenêtre de hook d''accessibilité active';
      WND_ICAATH_CLASSNAME = 'Seamless Host Agent - user mode support';
      WND_ICAATH_CLASSTEXT = 'Agent d''hôte transparent ICA';
      WND_SHELL_CLASSNAME = 'WFShell';
      WND_SHELL_CLASSTEXT = 'WFShell';
      WND_SHELLW_CLASSNAME = 'WFShellWnd';
      WND_SHELLW_CLASSTEXT = 'WFShellWindow';
      WND_ICACCS_CLASSNAME = 'ICA Control Channel support';
    var
      RemotedSession, TransparentMode, CitrixFound: Boolean;
    begin
      Result := False;
     
      RemotedSession := IsRemoteSession();
      if Assigned(AIsRemotedSessionWithoutCitrix) then
        AIsRemotedSessionWithoutCitrix^ := RemotedSession;
     
      if RemotedSession then
      begin
        // Si l'on détecte la transparence, c'est que c'est bien du Citrix
        TransparentMode := (FindWindow(WND_HOOK_CLASSNAME, WND_HOOK_CLASSTEXT) <> 0) or (FindWindow(WND_HOOK_CLASSNAME, nil) <> 0) or (FindWindow(nil, WND_HOOK_CLASSTEXT) <> 0);
        // On cherche toutes les autres fenêtres Citrix connue pour le moment
        CitrixFound := TransparentMode
          or (FindWindow(WND_SHELL_CLASSNAME, WND_SHELL_CLASSTEXT) <> 0) or (FindWindow(WND_SHELL_CLASSNAME, nil) <> 0) or (FindWindow(nil, WND_SHELL_CLASSTEXT) <> 0)
          or (FindWindow(WND_SHELLW_CLASSNAME, WND_SHELLW_CLASSTEXT) <> 0) or (FindWindow(WND_SHELLW_CLASSNAME, nil) <> 0) or (FindWindow(nil, WND_SHELLW_CLASSTEXT) <> 0)
          or (FindWindow(WND_ICACCS_CLASSNAME, nil) <> 0)
          or (FindWindow(WND_ICAATH_CLASSNAME, WND_ICAATH_CLASSTEXT) <> 0) or (FindWindow(WND_ICAATH_CLASSNAME, nil) <> 0) or (FindWindow(nil, WND_ICAATH_CLASSTEXT) <> 0);
     
        Result := CitrixFound;
        if CitrixFound and Assigned(ATransparentSeamlessModeActivated) then
          ATransparentSeamlessModeActivated^ := TransparentMode;
      end;
    end;
    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
    //------------------------------------------------------------------------------
    class function TSliteModuleTool.IsRemoteSession(): Boolean;
    const
      TERMINAL_SERVER_KEY = 'SYSTEM\CurrentControlSet\Control\Terminal Server\';
      GLASS_SESSION_ID    = 'GlassSessionId';
    var
      hRegKey: HKEY;
      dwGlassSessionId: DWORD;
      cbGlassSessionId: DWORD;
      dwCurrentSessionId: DWORD;
      dwType: DWORD;
    begin
      if FSessionType = rsNone then
      begin
        if LongBool(GetSystemMetrics(SM_REMOTESESSION)) then
          FSessionType := rsRemoted;
     
        (* You should not use GetSystemMetrics(SM_REMOTESESSION) to determine
        if your application is running in a remote session in Windows 8 and later or Windows Server 2012 and later
        if the remote session may also be using the RemoteFX vGPU improvements to the Microsoft Remote Display Protocol (RDP).
        In this case, GetSystemMetrics(SM_REMOTESESSION) will identify the remote session as a local session.
     
        Your application can check the following registry key to determine whether the session is a remote session that uses RemoteFX vGPU.
        If a local session exists, this registry key provides the ID of the local session : HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\GlassSessionId
        If the ID of the current session in which the application is running is the same as in the registry key, the application is running in a local session.
        Sessions identified as remote session in this way include remote sessions that use RemoteFX vGPU. *)
        if (FSessionType = rsNone) and CheckWin32Version(6, 2) then
        begin
          try
            if RegOpenKeyEx(HKEY_LOCAL_MACHINE, TERMINAL_SERVER_KEY, 0, KEY_READ, hRegKey) = ERROR_SUCCESS then
            begin
              cbGlassSessionId := SizeOf(dwGlassSessionId);
     
              if RegQueryValueEx(hRegKey, GLASS_SESSION_ID, nil, @dwType, PByte(@dwGlassSessionId), @cbGlassSessionId) = ERROR_SUCCESS then
                if ProcessIdToSessionId(GetCurrentProcessId(), &dwCurrentSessionId) then
                  if dwCurrentSessionId <> dwGlassSessionId then
                    FSessionType := rsRemoted;
            end;
          finally
            if hRegKey <> 0 then
              RegCloseKey(hRegKey);
          end;
        end;
     
        if FSessionType = rsNone then
          FSessionType := rsLocal;
      end;
     
      Result := FSessionType = rsRemoted;
    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

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/06/2018, 12h52
  2. Problème d'impression avec QuickReport sous Delphi
    Par abdenour-nab dans le forum Bases de données
    Réponses: 2
    Dernier message: 31/12/2008, 10h28
  3. [QuickReport & Delphi 5] Problème d'impression de ligne
    Par vitch8 dans le forum Composants VCL
    Réponses: 5
    Dernier message: 26/09/2007, 12h58
  4. Problème d'impression avec delphi
    Par Bourak dans le forum Langage
    Réponses: 1
    Dernier message: 12/11/2005, 17h13
  5. Problème d'impression
    Par IngBen dans le forum C++Builder
    Réponses: 7
    Dernier message: 22/05/2002, 11h37

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