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.
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.
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.
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_USER\Software\Microsoft\Windows
NT\CurrentVersion\Devices
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.
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.
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 ?
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.
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 ?
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
Sylvain a écrit :
imprimer hors une appli MFC est ... un vrai bordel!
<troll>
Les MFC sont elles mêmes un vrai bordel :-)
Beurk..
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.
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) ?
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) ?
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) ?
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.
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.
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.
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.
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.
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.
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...
Caliban wrote:
Bref c'est super. Merci Christian pour ce lien.
J'ai vu que Sylvain avait donné exactement la même chose...
J'ai vu que Sylvain avait donné exactement la même chose...
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
"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
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