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

Langage Delphi Discussion :

Créer une imprimante


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut Créer une imprimante
    Bonjour tous le monde.

    Je cherche des exemples me permettant de créer une imprimante qui n'en est pas une ... je m'explique.

    Je voudrais :
    - ajouter une imprimante dans windows (drivers ?)
    - lors de son utilisation (fichier/imprimer depuis n'importe quel logiciel) ouvrir simplement une Tform au lieu d'avoir une impression.
    - sur cette TForm pouvoir soit annuler l'impression, soit poursuivre pour vraiment imprimer.

    J'ai cherché longuement, lu pas mal de chose, télécharger des projets, mais j'y comprends rien.

    Un example serais le bienvenu, un début d'explication, une piste...

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    +1

    j'aimerais faire la même chose

    d'après ce projet, j'ai comme l'impression qu'il "suffit" d'écrire une DLL et de la déclarer avec des fichiers "gpd"...mais je n'ai pas trouvé d'information très claire sur le sujet ni pris le temps de creuser les sources.

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    +1

    j'aimerais faire la même chose
    ...
    Hé bien comme çà on est déjà 2

    Je vais terminer mon nouveau module actuel et ensuite j'attaque ce problème.

    MErci pour le lien.

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    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 563
    Points : 25 165
    Points
    25 165
    Par défaut
    Ce n'est qu'un fichier parmis tant d'autres, en plus, cela semble même pas être vraiment le driver mais une surcouche à PostScript

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    bon alors j'ai réussi à faire une DLL sous Delphi 32 bits qui fonctionne comme imgport.dll de ImagePrinter...par contre je galère sur son installation.

    c'est à dire que si j'installe ImagePrinter et que je remplace la DLL par la mienne dans c:\windows\system32 ça fonctionne...mais je n'ai pas encore réussi à installer moi même la DLL

    j'en profite pour tester sous Win7/64bits, qui n'est pas supporté par ImagePrinter, et tout ce que j'arrive à faire c'est de planter le spooler sans trop d'information

    Le principe de ImagePrinter c'est d'utiliser UNIDRV de Windows pour récupérer une impression PCL, ensuite le code PCL est interpréter pour le transformer en Bitmap puis en JPG, PDG, TIFF, etc; tout cela c'est le boulot de la DLL ci-dessus qui est un Print Monitor

  6. #6
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Ce n'est qu'un fichier parmis tant d'autres, en plus, cela semble même pas être vraiment le driver mais une surcouche à PostScript
    Si tu inspect les clé de registre de PDFCreator, cela reste cohérent par rapport au fichier ModPrinter.bas.

    Citation Envoyé par Paul TOTH Voir le message
    c'est à dire que si j'installe ImagePrinter et que je remplace la DLL par la mienne dans c:\windows\system32 ça fonctionne...mais je n'ai pas encore réussi à installer moi même la DLL
    Tu pourrais me donner un message d'erreur ou autre, j'ai pas mal de contact en administration réseau et autre...

    Citation Envoyé par Paul TOTH Voir le message
    j'en profite pour tester sous Win7/64bits, qui n'est pas supporté par ImagePrinter, et tout ce que j'arrive à faire c'est de planter le spooler sans trop d'information
    Je ne t'apprends rien si je te dis que ta DLL 32 ne marchera jamais sur un 64bits...



    Sinon ok pour le principe, même si je ne sais pas encore (moi) l'intepréter ou même le programmer.

    Sinon, je suis la piste du registre, j'analyse déjà les cles de PDFCreator, et je m'amuse avec tous les drivers que j'ai récupérés, dont ton premier lien.
    J'ai aussi en interne "au boulot" un logiciel qu'on utilise qui fait exactement ce que je cherche, il est développé en windev, donc je le scrute également, j'ai pas encore fais la jonction entre le l'imprimante et l'ouverture d'une form.

    A suivre

  7. #7
    Membre averti Avatar de shell13010
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2008
    Messages : 281
    Points : 314
    Points
    314
    Par défaut
    Bonsoir,

    Si j'ai bien compris?

    Peut-être que ceci pourrait te donner une petite pistes : Virtual Printer

    Bonne soirée.

  8. #8
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    Bon, je progresse dans ma compréhension des choses.

    Il "suffit" d'écrire un "Print Port Monitor" qui est une bête DLL qui exporte InitializePrintMonitor. Celle-ci est ensuite déclarée comme "Monitor" dans la clé de registre
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\
    (il faut relancer le Spooler pour quelle soit prise en compte).

    dès lors l'onglet "Port" des imprimantes propose le port déclaré dans cette DLL qui (comme le port FILE: ) se contente d'enregistrer l'impression dans un fichier, en le convertissant en BMP, JPEG, PDF, etc... au passage si on veux.

    mon code fonctionne sous XP, mais pas sous Seven32bits et plante le spooler sous Seven64bits...ce qui d'après cette page et lié au fait que mon code n'est pas signé...reste à trouver comme on fait ça

    EDIT: signtool.exe signwizard, sauf que ça n'a pas l'air de changer grand chose...

  9. #9
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\
    J'ai effectivement vue cela hier. et donc,

    Citation Envoyé par Paul TOTH Voir le message
    ... Il "suffit" d'écrire un "Print Port Monitor" qui est une bête DLL qui exporte InitializePrintMonitor.
    Tu veux dire qu'il suffit d'écrire une DLL qui donne accès à une procédure initializePrintMinitor et cette procédure fais démarrer une TForm ?
    • Si oui, le nom de la DLL a-t-elle un importance ?
    • Si non, tu peux être plus claire dans la concéption de la DLL ?


    Dans les deux cas pour ton problème sur 32bits as-tu pensé à registrer la DLL.

    Merci

  10. #10
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    J'oubliais, as-tu vérifié cette clé de registre sous seven

    "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Ports"

    a suivre

  11. #11
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Désolé pour les minis message...

    Je viens de trouver la conception d'une DLL pour le 64bits, si tu regardes les messages qui y sont lié, je pense que cela règle le problème de la DLL sous 64 bits.

    DLL 64 BITS

    C'est de la balle...

    AUTRES PRECISIONS :
    Sous Seven les la clé où se trouve les drivers est

    HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Print\Environments\Windows x64\Drivers\Version-3

  12. #12
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Je reviens sur mon lien sur la DLL 64 bits

    j'ai tenté de la mettre en oeuvre mais j'ai un souci

    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
    library PMon64;
     
    {$H+}
     
    uses Windows, Sysutils, Classes, Controls;
     
    Type
     lpByte = PByte;
     
    type
       pMonitor=^rMonitor;
     
       TEnumPortsFunc=function(pName:LPWSTR;dwLevel:DWORD;pPorts:LPBYTE;
                               cbBuf:DWORD;pdwNeeded:LPDWORD;
                               pdwReturned:LPDWORD):BOOL;stdcall;
       TOpenPortFunc=function(pName:LPWSTR;H:PHANDLE):BOOL;stdcall;
       TOpenPortExFunc=function(pName,pPrinterName:LPWSTR;H:PHANDLE;
                                _Monitor:pMonitor):BOOL;stdcall;
       TStartDocPortFunc=function(hPort:HANDLE;pPrinterName:LPWSTR;
                                  JobID,Level:DWORD;
                                  pDocInfo:LPBYTE):BOOL;stdcall;
       TWritePortFunc=function(hPort:HANDLE;pBuffer:LPBYTE;
                               cbBuf:DWORD;pcbWritten:LPDWORD):BOOL;stdcall;
       TReadPortFunc=function(hPort:HANDLE;pBuffer:LPBYTE;cbBuf:DWORD;
                              pcbRead:LPDWORD):BOOL;stdcall;
       TEndDocPortFunc=function(hPort:HANDLE):BOOL;stdcall;
       TClosePortFunc=function(hPort:HANDLE):BOOL;stdcall;
       TAddPortFunc=function(pName:LPWSTR;h:HWND;
                             pMonitorName:LPWSTR):BOOL;stdcall;
       TAddPortExFunc=function(pName:LPWSTR;Level:DWORD;pBuffer:LPBYTE;
                               pMonitorName:LPWSTR):BOOL;stdcall;
       TConfigurePortFunc=function(pName:LPWSTR;h:HWND;
                                   pMonitorName:LPWSTR):BOOL;stdcall;
       TDeletePortFunc=function(pName:LPWSTR;h:HWND;
                                pMonitorName:LPWSTR):BOOL;stdcall;
       TGetPrinterDataFromPortFunc=function(hPort:HANDLE;ControlID:DWORD;
                                          pValueName,lpInBuffer:LPWSTR;
                                          cbInBuffer:DWORD;
                                          lpOutBuffer:LPWSTR;
                                          cbOutBuffer:DWORD;
                                          lpcbReturned:LPDWORD):BOOL;stdcall;
       TSetPortTimeOutsFunc=function(hPort:HANDLE;lpTCO:pCommTimeouts;
                                     reserved:DWORD):BOOL;stdcall;
       TXcvOpenPortFunc=function(pszObject:LPCWSTR;GrantedAccess:ACCESS_MASK;
                                 phXcv:PHANDLE):BOOL;stdcall;
       TXcvDataPortFunc=function(hXcv:HANDLE;pszDataName:LPCWSTR;
                                 pInputData:PBYTE;cbInputData:DWORD;
                                 pOutputData:PBYTE;cbOutputData:DWORD;
                                 pcbOutputNeeded:PDWORD):DWORD;stdcall;
       TXcvClosePortFunc=function(hXcv:HANDLE):BOOL;stdcall;
     
       rMonitor=packed record
         pfnEnumPorts: TEnumPortsFunc;
         pfnOpenPort: TOpenPortFunc;
         pfnOpenPortEx: TOpenPortExFunc;
         pfnStartDocPort: TStartDocPortFunc;
         pfnWritePort: TWritePortFunc;
         pfnReadPort: TReadPortFunc;
         pfnEndDocPort: TEndDocPortFunc;
         pfnClosePort: TClosePortFunc;
         pfnAddPort: TAddPortFunc;
         pfnAddPortEx: TAddPortExFunc;
         pfnConfigurePort: TConfigurePortFunc;
         pfnDeletePort: TDeletePortFunc;
         pfnGetPrinterDataFromPort: TGetPrinterDataFromPortFunc;
         pfnSetPortTimeOuts: TSetPortTimeOutsFunc;
         pfnXcvOpenPort: TXcvOpenPortFunc;
         pfnXcvDataPort: TXcvDataPortFunc;
         pfnXcvClosePort: TXcvClosePortFunc;
       end;
       rMonitorEx=packed record
         dwMonitorSize:DWORD;
         Monitor:rMonitor;
       end;
       pMonitorEx=^rMonitorEx;
     
    var
       Mon:rMonitorEx;
     
    procedure DbgSend(Text:String);
    var f:Textfile;
    begin
       if FileExists('C:\TMP\DEBUG.TXT') then begin
         AssignFile(f,'C:\TMP\DEBUG.TXT');
         Append(f);
         Writeln(f,FormatDateTime('HH:MM:SS',now())+': '+Trim(Text));
         CloseFile(f);
       end;
    end;
     
    function EnumPorts(pName:LPWSTR;dwLevel:DWORD;pPorts:LPBYTE;
                        cbBuf:DWORD;pdwNeeded:LPDWORD;
                        pdwReturned:LPDWORD):BOOL;stdcall;
    begin
       DbgSend('EnumPorts');
    end;
     
    function OpenPort(pName:LPWSTR;H:PHANDLE):BOOL;stdcall;
    begin
       DbgSend('OpenPort');
    end;
     
    function StartDocPort(hPort:HANDLE;pPrinterName:LPWSTR;
                           JobID,Level:DWORD;pDocInfo:LPBYTE):BOOL;stdcall;
    begin
       DbgSend('StartDocPort');
    end;
     
    function WritePort(hPort:HANDLE;pBuffer:LPBYTE;cbBuf:DWORD;
                        pcbWritten:LPDWORD):BOOL;stdcall;
    begin
       DbgSend('WritePort');
    end;
     
    function ReadPort(hPort:HANDLE;pBuffer:LPBYTE;cbBuf:DWORD;
                       pcbRead:LPDWORD):BOOL;stdcall;
    begin
       DbgSend('ReadPort');
    end;
     
    function EndDocPort(hPort:HANDLE):BOOL;stdcall;
    begin
       DbgSend('EndDocPort');
    end;
     
    function ClosePort(hPort:HANDLE):BOOL;stdcall;
    begin
       DbgSend('ClosePort');
    end;
     
    function AddPort(pName:LPWSTR;h:HWND;pMonitorName:LPWSTR):BOOL;stdcall;
    begin
       DbgSend('AddPort');
    end;
     
    function AddPortEx(pName:LPWSTR;Level:DWORD;pBuffer:LPBYTE;
                        pMonitorName:LPWSTR):BOOL;stdcall;
    begin
       DbgSend('AddPortEx');
    end;
     
    function ConfigurePort(pName:LPWSTR;h:HWND;
                            pMonitorName:LPWSTR):BOOL;stdcall;
    begin
       DbgSend('ConfigurePort');
    end;
     
    function DeletePort(pName:LPWSTR;h:HWND;
                         pMonitorName:LPWSTR):BOOL;stdcall;
    begin
       DbgSend('DeletePort');
    end;
     
    function InitializePrintMonitor(pRegRoot:LPWSTR):pMonitorEx;stdcall;export;
    begin
       DbgSend('InitializePrintMonitor start');
       Result:=@Mon;
       DbgSend('InitializePrintMonitor end');
    end;
     
    exports InitializePrintMonitor;
     
    begin
       DbgSend('MainSection start');
     
       Mon.dwMonitorSize:=SizeOf(rMonitor);
       Mon.Monitor.pfnEnumPorts:=EnumPorts;
       Mon.Monitor.pfnOpenPort:=OpenPort;
       Mon.Monitor.pfnOpenPortEx:=nil;
       Mon.Monitor.pfnStartDocPort:=StartDocPort;
       Mon.Monitor.pfnWritePort:=WritePort;
       Mon.Monitor.pfnReadPort:=ReadPort;
       Mon.Monitor.pfnEndDocPort:=EndDocPort;
       Mon.Monitor.pfnClosePort:=ClosePort;
       Mon.Monitor.pfnAddPort:=AddPort;
       Mon.Monitor.pfnAddPortEx:=AddPortEx;
       Mon.Monitor.pfnConfigurePort:=ConfigurePort;
       Mon.Monitor.pfnDeletePort:=DeletePort;
       Mon.Monitor.pfnGetPrinterDataFromPort:=nil;
       Mon.Monitor.pfnSetPortTimeOuts:=nil;
       Mon.Monitor.pfnXcvOpenPort:=nil;
       Mon.Monitor.pfnXcvDataPort:=nil;
       Mon.Monitor.pfnXcvClosePort:=nil;
     
       DbgSend('MainSection end');
    end.
    Déjà LPBYTE que j'ai traduit en

    Et puis HANDLE, par exemple sur la function :
    TStartDocPortFunc=function(hPort:HANDLE;pPrinterName:LPWSTR;
    JobID,LevelWORD;
    pDocInfo:LPBYTE):BOOL;stdcall;

    Je n'arrive pas à compiler à cause de HANDLE ([DCC Erreur] PMon64.dpr(22): E2005 'HANDLE' n'est pas un identificateur de type) , mais je ne sais pas comment traduire cela ? une idée ?

    Merci

  13. #13
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    oui j'ai vu ce code, j'ai quasiment le même en fait

    mais ce n'est pas un "driver" d'imprimante, (Windows x64\Drivers\Version-3) mais bien un "Port Monitor", comme indiqué dans ton lien ça se déclare dans HKLM\SYSTEM\CurrentControlSet\Control\Print\Monitors, le nom de la clé n'a pas d'importance, elle doit juste contenir une valeur chaine Driver qui donne le nom de la DLL que l'on place dans windows\system32.
    En fait l'imprimante possède son driver, le Port Monitor correspond à la connexion (LPT1, COM1, USB, FILE, etc...), son boulot est de transmettre à l'imprimante ce que lui fourni le driver.

    et j'ai donc moi aussi un plantage sur w64 avant l'appel à quoi que ce soit.

    sous seven32bits la dll fonctionne en ce sens que j'ai bien mon port qui apparait, mais que je face en AllocConsole ou un AssignFile() je ne parviens pas à avoir de log des appels...c'est très étrange, comme si la DLL n'avait pas certain privilèges, d'ailleurs je ne parviens pas non plus à traiter les impression en les enregistrant dans C:\PRINT.RAW

    je mets en PJ le code et le .Reg qui permet d'enregistrer la DLL...le code fonctionne sous D6 et XE2 32bits pour une installation sous XP, il compile sous XE2 64bits mais plante le spooler.

    RAWPortMonitor.zip

  14. #14
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Re

    Je vais regardé de mon coté, mais juste comme cela j'éviterai d'écrire sur C:\
    sous seven 32 ou 64 d'ailleurs.

    A+

  15. #15
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    ah, au fait, HANDLE c'est un THandle, mais dans mon code j'utilise un objet vu que les "handle" sont des valeurs opaques et que moi j'ai besoin d'un objet ... hum...faut tout de même que je vérifie la taille d'un HANDLE en 64bits...en 32bits en tout cas c'est la même taille qu'un pointeur et donc qu'une instance objet.

  16. #16
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    bon effectivement sur XP ça marche.

    Sous Seven 64 bits impossible de remonter un port :
    * je crée la clé de registre
    * je place la Dll dans system32 ou même sysWOW64
    * un petit coup de net stop/net start spooler

    Le port n’apparaît pas dans la liste des port que se soit sur une imprimante existante ou une imprimante nouvelle.

    Comment as-tu pu avoir une erreur de spooler 64 chez toi ? cela sous-entend que tu aurai le port accessible ?

    Sinon avec ton info de THandle, la compilation de la Dll64 fonctionne, évidement j'arrive pas à la tester, je la mets ici au cas où:

    A suivre
    Fichiers attachés Fichiers attachés

  17. #17
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    Citation Envoyé par BuzzLeclaire Voir le message
    bon effectivement sur XP ça marche.

    Sous Seven 64 bits impossible de remonter un port :
    * je crée la clé de registre
    * je place la Dll dans system32 ou même sysWOW64
    * un petit coup de net stop/net start spooler

    Le port n’apparaît pas dans la liste des port que se soit sur une imprimante existante ou une imprimante nouvelle.

    Comment as-tu pu avoir une erreur de spooler 64 chez toi ? cela sous-entend que tu aurai le port accessible ?

    Sinon avec ton info de THandle, la compilation de la Dll64 fonctionne, évidement j'arrive pas à la tester, je la mets ici au cas où:

    A suivre
    non j'ai trois comportements:

    1) XP: ok
    2) Seven32bits: le port apparait mais ne fonctionne pas
    3) Seven64bits: le port n'apparait pas et quelque secondes après le "net start spooler" le service se plante.

    j'ai cette erreur dans l'observateur d'évènements
    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
     
    - <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
    - <System>
      <Provider Name="Service Control Manager" Guid="{555908d1-a6d7-4695-8e1e-26931d2012f4}" EventSourceName="Service Control Manager" /> 
      <EventID Qualifiers="49152">7034</EventID> 
      <Version>0</Version> 
      <Level>2</Level> 
      <Task>0</Task> 
      <Opcode>0</Opcode> 
      <Keywords>0x8080000000000000</Keywords> 
      <TimeCreated SystemTime="2012-10-31T19:11:31.590742200Z" /> 
      <EventRecordID>267355</EventRecordID> 
      <Correlation /> 
      <Execution ProcessID="608" ThreadID="7052" /> 
      <Channel>System</Channel> 
      <Computer>execute.re</Computer> 
      <Security /> 
      </System>
    - <EventData>
      <Data Name="param1">Spouleur d’impression</Data> 
      <Data Name="param2">15</Data> 
      </EventData>
      </Event>
    je dois supprimer la clé de registre pour pouvoir le relancer sans plantage.

  18. #18
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Voilà ou j'en suis

    Je confirme que cette clé est la seule utile pour créer le monitor port
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors

    En cherchant, j'ai trouvé cella que j'ai testé jusqu'au bout :
    REDMON

    * Je lance le fichier Setup64.exe
    Dans le registre après ce lancement seule la clé HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors lié à la dll RedMon64.dll qui est copier uniquement dans c:\windows\system32 (sans oublié les sous-clé automatiques ControlSet001 et ControlSet002)

    * J'ajoute une imprimante locale et je ne trouve aucun port
    Je fais un coup de net stop/net start
    * J'ajoute une imprimante locale et là :
    1. Je choisi créer un nouveau port
    2. je prends Redirected port (qui est spécifique à redMon)
    3. Le Port Name est proposé en RPT1:, là la base de registre ajoute une clé
      HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Redirected Port\Ports\RPT1:
    4. Ensuite je prends une imprimante "HP DeskJEt 450"


    A partir de là l'imprimante est installé et lié au port RPT1: sur le PrinterMonitor RedMon et don la DLL RedMon64

    J'ouvre les propriétés de l'imprimante, je vais dans l'onglet Ports je clique sur le bouton Configurer Port et là on retrouve la même fenêtre fais part PDFCreator. Dans la zone Redirect this port to the program, je mets un petit projet1.exe, lorsque j'imprimante le projet s'ouvre...

    En résumé, le problème viens juste de la concéption de la DLL64.

    A suivre

  19. #19
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    j'en suis arrivé à la même conclusion logique.

    Ceci dit, REDMON exporte d'autres fonctions que mon code...mais ce qui me perturbe c'est que pdfcmon.dll de PDFCreator ne les exporte pas et ça fonctionne aussi ^^

  20. #20
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Bon priori il faut compiler avec une directive C.

    Après pas mal de recherche le Packed Record doit être "aligné" avec cette directive.
    Etrait 1
    The problem is that the byte alignment of data in these structures can be
    different in Free Pascal and in C -it seems to be also compiler dependant. It affects the
    byte position of each element of the record and the total size of the record. The directive
    {$PACKRECORDS C} forces byte alignment to be similar to GCC compilers [5]
    .

    Extrait 2
    As far as I can see the patch is correct except for the {$packrecord c} in seh64

    E.g. the structures in seh64.inc are under pshpack4 which afaik translates to {$packrecords 4} not {$packrecords C} (which is natural alignment).

    The one in win64/system seems to be ok ( I don't see any pack directives there, so the default, packrecords C seems to be logical)
    Mais la directive {$PACKRECORDS C} je ne peux pas l'implémenter, elle mets refusé sur mon D2009, est-ce une directive propre à FreePascal ?, j'ai bien tenté {$An} où n doit être 1,2,4,8,16, mais même en réussissant à compiler cela ne fonctionne pas.

    J'espère ne pas me trompé sur cette histoire de taille de record et que cela pourra également t'aider.

Discussions similaires

  1. Comment créer une imprimante virtuelle?
    Par lbeaumonp dans le forum Windows
    Réponses: 4
    Dernier message: 26/01/2014, 22h26
  2. Créer une imprimante virtuelle
    Par christophertux dans le forum Virtualisation
    Réponses: 4
    Dernier message: 06/10/2010, 13h38
  3. Créer une imprimante virtuel
    Par neodelphi2007 dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 28/02/2009, 08h21
  4. Créer une imprimante sur réseau local.
    Par byloute dans le forum Windows XP
    Réponses: 5
    Dernier message: 11/10/2007, 13h25
  5. Créer un compte qui donne accès seulement à une imprimante
    Par bart64 dans le forum Windows Serveur
    Réponses: 1
    Dernier message: 06/09/2006, 19h19

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