Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Envoyer un fichier vers un driver d'imprimante

11 réponses
Avatar
Caliban
Bonjour

J'ai besoin d'envoyer un fichier contenant des codes d'impression
spécifiques (genre HPGL bricolé) vers un driver d'imprimante à
sélectionner, pas forcément l'imprimante par défaut. Ce qu'on ferait
avec une commande PRINT en mode console, sauf erreur.

Je dois donc faire apparaître la boîte de dialogue standard de sélection
des imprimantes disponibles, et ensuite envoyer la purée, en l'occurence
un fichier texte, vers le driver ad hoc qui se charge de spooler et
communiquer avec la bécane. Je sais dessiner dans un DC associé à une
imprimante et ensuite produire la page, mais là c'est différent, je dois
envoyer un fichier de commandes textes vers le spooler d'une imprimante
un peu spéciale dont le driver a été installé. Cette imprimante
virtuelle peut être sur n'importe quel port (en général USB) et c'est
pas mon souci. Donc pas de copie directe vers LPT ou un truc de ce
genre, mais un envoi au driver qui se contentera de spooler.

Pour résumer, j'ai un fichier texte que je sais produire, mais je ne
sais pas sélectionner l'imprimante dans une boîte de dialogue standard
Windows ni ensuite l'envoyer au driver.

Merci pour toute piste.

10 réponses

1 2
Avatar
loic
"Caliban" wrote in message
news:45617895$0$5071$
Bonjour

Ce qu'on ferait avec une commande PRINT en mode console, sauf erreur.
....
Donc pas de copie directe vers LPT ou un truc de ce genre



Tu te contredis, puisqu'avec PRINT /d, on envoie justement vers LPT . Pas
très clair donc.
Avatar
Sylvain
Caliban wrote on 20/11/2006 10:43:

J'ai besoin d'envoyer un fichier contenant des codes d'impression
spécifiques (genre HPGL bricolé) vers un driver d'imprimante à
sélectionner, pas forcément l'imprimante par défaut. Ce qu'on ferait
avec une commande PRINT en mode console, sauf erreur.



imprimer hors une appli MFC est ... un vrai bordel!

je n'ai pas pu pour l'heure mener à bien un truc aussi simple que
récupérer une matricielle (vieille EPSON) depuis le "StandardGetPrinter"
ouvrir ce port et balancer du bon vieux code de contrôle.

1- à tout le moins, en direct (donc sans Printer Chooser qui peut être
indispensable si on ne connait pas le path de l'imprimante) on peux faire:

HANDLE hPrinter = null;
OpenPrinter(printerName, &hPrinter, null);
// donc connaitre le printerName, les imprimantes dispo
// sont sous :
// HKEY_CURRENT_USERSoftwareMicrosoftWindows
NTCurrentVersionDevices

DOC_INFO_1 docInfo;
docInfo.pDocName = "whatever";
docInfo.pOutputFile = null;
docInfo.pDatatype = "RAW";
// inform the spooler the document is beginning.
DWORD dwJob = ::StartDocPrinter(hPrinter, 1, (byte*) &docInfo);

if (dwJob){
// start a page.
::StartPagePrinter(hPrinter);
// envoyer son stream binaire pré-formatté (data, 'count' bytes)
::WritePrinter(hPrinter, data, count, &dwBytesWritten);
// end the page
::EndPagePrinter(hPrinter);
}
// inform the spooler that the document is ending
::EndDocPrinter(hPrinter);
// tidy up the printer handle.
::ClosePrinter(hPrinter);

là (pour l'heure) ça imprime et le driver explose (pour l'instant j'ai
l'impression que c'est lui et non le code; pas jeune le driver).


2- reste donc à remplacer le OpenPrinter(fqNameOfPrinter) par un beau
dialog.
PAGESETUPDLG psd;
// init psd
PageSetupDlg(&psd)
est censé permettre cela, il affiche les propriétés de l'imprimante (pas
les détails propre au doc, page range, etc) et permet en même temps de
changer d'imprimante.

au retour psd.hDevNames contient le nom de l'imprimante:
DEVNAMES* devNames = (DEVNAMES*) ::GlobalLock(psd.hDevNames);
char* name = (char*) devNames + devNames->wDeviceOffset;

ce nom est censé marcher avec OpenPrinter()

maintenant soit tout cela est erroné, soit mon vieux driver EPSON est
pas ami avec mon OS, car je n'ai pas pu validé tout cale.

Sylvain.
Avatar
Caliban
loic wrote:

Tu te contredis, puisqu'avec PRINT /d, on envoie justement vers LPT . Pas
très clair donc.



Ben non, si tu tapes HELP PRINT, tu verras que ça part pas forcément
vers un port LPT. Tu peux choisir un périphérique d'impression.

Mon problème est que l'imprimante virtuelle en question peut être sur
LPT, sur COM (avec protocoles divers selon le modèle) ou sur un USB, et
seul le driver installé avec l'imprimante le sait. Donc je veux pas
envoyer le fichier vers un port en particulier mais vers le driver de
l'imprimante qui se débrouille avec. Donc je dois permettre à
l'utilisateur de sélectionner l'imprimante cible puis y envoyer le fichier.

C'est-y plus clair comme ça ?
Avatar
Alain Gaillard
Sylvain a écrit :

imprimer hors une appli MFC est ... un vrai bordel!



<troll>

Les MFC sont elles mêmes un vrai bordel :-)
Beurk..

</troll>

--
Alain
Avatar
loic
"Caliban" wrote in message
news:4562cc23$0$27397$
loic wrote:

Tu te contredis, puisqu'avec PRINT /d, on envoie justement vers LPT . Pas
très clair donc.



Ben non, si tu tapes HELP PRINT, tu verras que ça part pas forcément vers
un port LPT. Tu peux choisir un périphérique d'impression.



Ben si, tu envoies vers LPT, PRN, AUX, ...
Tu n'as pas du tout accès aux drivers Windows avec PRINT.
Avatar
Christian ASTOR
Caliban wrote:

Pour résumer, j'ai un fichier texte que je sais produire, mais je ne
sais pas sélectionner l'imprimante dans une boîte de dialogue standard
Windows ni ensuite l'envoyer au driver.



Au driver ?
ou à l'imprimante directement (comme PageSetupDlg() + KB138594) ?
Avatar
Caliban
loic wrote:

Ben si, tu envoies vers LPT, PRN, AUX, ...
Tu n'as pas du tout accès aux drivers Windows avec PRINT.



Autant pour moi, donc on oublie PRINT. Je veux envoyer un fichier vers
le driver pour qu'il le spoole direction l'imprimante. Et aussi pouvoir
sélectionner cette imprimante dans une liste avec une boîte de dialogue
d'impression standard.
Avatar
Caliban
Christian ASTOR wrote:

Au driver ?
ou à l'imprimante directement (comme PageSetupDlg() + KB138594) ?



L'envoi direct à l'imprimante doit pouvoir suffire. En fait, faut que je
voie avec le client si son driver fait des trucs particuliers dont il
aurait besoin. A priori non, donc le code de cette KB138594 m'a l'air
d'être exactement ce qu'il faudrait. Et PageSetupDlg va bien pour
choisir l'imprimante.

Bref c'est super. Merci Christian pour ce lien.
Avatar
Christian ASTOR
Caliban wrote:

Bref c'est super. Merci Christian pour ce lien.



J'ai vu que Sylvain avait donné exactement la même chose...
Avatar
Remi THOMAS
"Caliban" écrivit
Bonjour

J'ai besoin d'envoyer un fichier contenant des codes d'impression
spécifiques (genre HPGL bricolé) vers un driver d'imprimante à
sélectionner, pas forcément l'imprimante par défaut. Ce qu'on ferait avec
une commande PRINT en mode console, sauf erreur.



...

Merci pour toute piste.



As-tu cherché dans Google?
http://groups.google.com/group/fr.comp.os.ms-windows.programmation/msg/119b1516ebb82776?dmode=source

Rémi
1 2