[VC++/MFC] Wijzigen standaard printer

Pagina: 1
Acties:
  • 105 views sinds 30-01-2008
  • Reageer

  • Psychokiller
  • Registratie: Oktober 2001
  • Niet online
Voor mijn stageopdracht moet ik onder andere een MS Office (97 in dit geval) bestand om te zetten naar een PostScript bestand in VC++ en met behulp van MFC.
Dit wil ik doen door te printen naar een toegevoegde lokale printer wat niet de default printer is.
Hiervoor wil ik dus tijdelijk de standaard printer wijzigen, het bestand sturen, de printer terugzetten.

Met behulp van de tutorial Use Automation to Set the Printer from an MFC Project heb ik een volgende testmethode opgezet:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void CTestExcelDlg::testExcel( void )
{
    _Application objExcel;
    
    // Get the IDispatch pointer and attach it to the objExcel object.
    if (!objExcel.CreateDispatch("Excel.Application"))
    {
        AfxMessageBox("Couldn't get Excel object.");
    }

    // Get current default printer
    CString curPrinter = objExcel.GetActivePrinter();
    
    MessageBox("Printer: " +curPrinter,"PrinterName:",MB_OK);
    //  'Oce6410 on LPT1:'
    
    // Set default printer back to orginal
    objExcel.SetActivePrinter(curPrinter);

    // Quit Excel
    objExcel.Quit();
}
Bij het aanroepen van de SetActivePrinter methode krijg ik echter steeds de melding:
"Unable to set the ActivePrinter property", wat er op duid dat de printer niet gevonden kan worden of de eigenschap readonly is.

Dit terwijl dezelfde code wel werkt voor een MS Word object.

De MSDN pagina geeft 1 pagina bij de zoekterm, maar daar gaat het niet over deze foutmelding.

Via google las ik dat Excel ook de poort wil hebben en niet enkel de printernaam, dat gaf echter geen verschil.
Geprobeert zijn onder andere:
objExcel.SetActivePrinter(curPrinter);
objExcel.SetActivePrinter("Oce6410");
objExcel.SetActivePrinter("Oce6410:");
objExcel.SetActivePrinter("Oce6410 on LPT1");
objExcel.SetActivePrinter("Oce6410 on LPT1:");

Als mogelijk alternatief zou ik nog de PrintOut() methode kunnen proberen van het Sheet of Workbook object waaraan ook een printer aan mee te geven is, maar mijn voorkeur gaat uit naar de eerste methode.
Nog een oplossing zou kunnen zijn om via het Word object de default printer te wijzigen en het uiteindelijk daarmee ook weer terug te zetten, maar dat lijkt me ook niet het meest ideaal.

Heeft er toevallig iemand een idee waarom de SetActivePrinter niet lijkt te werken voor Excel, of een andere / betere oplossing voor dit probleem ?

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 23:38
Lijkt me dat de naam hetzelfde moet zijn als de naam in je control panel.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Psychokiller
  • Registratie: Oktober 2001
  • Niet online
Dat heb ik dan ook als eerste geprobeert inderdaad, en dat werkte bij de Word variant dus wel :)

De printOut methode heeft ook niet opgeleverd wat ik hoopte. Daarbij wordt ook gewoon naar de actieve standaard printer geschreven.

Maargoed, ik zoek weer verder naar een oplossing :)

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 23:38
Is het een mogelijkheid om via de Win32 API de printer te veranderen, en niet door de Excel laag te gaan?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Psychokiller
  • Registratie: Oktober 2001
  • Niet online
Daar heb ik ook al hele middag gisteren naar gezocht. Zijn wel aantal artikelen in de MSDN library, maar geen van de geprobeerde veranderde de standaard printer ook echt voor heel windows. (Dat de printer dus ook bij de Printers in het configuratie scherm als standaard staat)

Voorlopig werkt het met het register, maar ik kan me zo voorstellen dat dit nog problemen gaat geven op een niet windows 2000 machine.

De oplossing zoals die voorlopig is:
C++:
1
2
3
4
5
6
7
8
9
10
11
// Get current default printer
char defPrinter[255] = ""; 
GetProfileString("windows","device","No default printer set",defPrinter,255);

// Set new default printer
WriteProfileString("windows","device","Printernaam,winspool,Ne01:");

// Conversie meuk + sturen naar printer

// Restore default printer
WriteProfileString("windows","device",defPrinter);

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Psychokiller schreef op donderdag 06 oktober 2005 @ 12:55:
Voor mijn stageopdracht moet ik onder andere een MS Office (97 in dit geval) bestand om te zetten naar een PostScript bestand in VC++ en met behulp van MFC.
Dit wil ik doen door te printen naar een toegevoegde lokale printer wat niet de default printer is.
Hiervoor wil ik dus tijdelijk de standaard printer wijzigen, het bestand sturen, de printer terugzetten.
Dat lijkt me niet de juiste methode.
Kun je niet gewoon aan de print opdracht vertellen naar welke printer het moet?

  • Psychokiller
  • Registratie: Oktober 2001
  • Niet online
Nou, dat zou wel beter zijn inderdaad, maar de ActivePrinter variabele uit de PrintOut methode geeft geen verschil.

Uit MSDN:
ActivePrinter Optional Variant. Sets the name of the active printer.

De PrintOut methode aangeroepen met dezelfde lijst aan printers als uit de startpost, maar de opdracht blijft naar de actieve standaard printer gestuurd worden.

Een aantal voorbeelden (welliswaar VB) op de MSDN pagina gebruiken overigens ook de SetActivePrinter om de systeem printer (tijdelijk) te wijzigen.

  • zwippie
  • Registratie: Mei 2003
  • Niet online

zwippie

Electrons at work

Eerste gedachte bij verkeerde printernaam:
Via GetPrinters of EnumPrinters kun je een lijst met geinstalleerde printers krijgen, daaruit kun je in ieder geval de juiste printernaam uitzoeken om te gebruiken.

How much can you compute with the "ultimate laptop" with 1 kg of mass and 1 liter of volume? Answer: not more than 10^51 operations per second on not more than 10^32 bits.

Pagina: 1