Announcement

Collapse
No announcement yet.

Druckertyp auslesen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Druckertyp auslesen

    Hallo,

    wie kann ich den Typ des Druckers auslesen?

    Printer()->Printers->Strings[Printer()->PrinterIndex] liefert leider nicht den Typ sondern den vom User vergebenen Namen und auch noch einen Netzwerkpfad. Ich brauche aber nur den Typ, wie er z.B. beim Öffnen der PrintDialogs unter dem Name separat aufgeführt wird.

    Mit welcher Funktion kommt man an diesen String?

    Danke - Peter

  • #2
    Könnte dir

    void __fastcall GetPrinter(char * ADevice, char * ADriver, char * APort, int &ADeviceMode);

    und die DEVMODE-Struktur un dort

    dmDeviceName

    Specifies the the "friendly" name of the printer; for example, "PCL/HP LaserJet" in the case of PCL/HP LaserJet®. This string is unique among device drivers. Note that this name may be truncated to fit in the dmDeviceName array.

    helfen
    Christian

    Comment


    • #3
      Hi Christian,

      wenn ich deine Parameter für die GetPrinter-Funktion anschaue meinst du sicher die Funtion von Printer(). Der DeviceMode hat da aber nichts mit DEVMODE der API-Funktion GetPrinter zu tun. Die ist nämlich definiert als:
      BOOL GetPrinter(HANDLE, usw) definiert.

      Daraufhin habe ich mehrer Sachen ausprobiert, die leider kein befriedigendes Ergebnis liefern:

      <PRE>
      // Hiermit wollte ich mir nur den Namen des aktuellen Druckers holen

      char ADevice[256],ADriver[256],APort[256];
      int ADeviceMode;
      Printer()->GetPrinter(ADevice, ADriver, APort, ADeviceMode);

      // Damit habe ich DeviceCapabilities gefüttert um die Werte in DevMode zu erhalten:

      HANDLE PrnHandle;
      DEVMODE DevMode;
      DWORD result = DeviceCapabilities(ADevice,APort,0,NULL,&DevMode);

      // Leider steht der Name in der DevMode-Struktur nicht drin !

      // Also weiter: Die GetPrinter-Funktion kann in der PRINTER_INFO_2 auch einen Namen zurückliefern:

      OpenPrinter(ADevice,&PrnHandle,NULL);
      if (PrnHandle != NULL)
      { PRINTER_INFO_2 Info;
      DWORD Anz;
      bool i = GetPrinter(PrnHandle,2,(LPBYTE)&Info,sizeof(Info), &Anz);
      ClosePrinter(PrnHandle);
      }

      // Leider ist dort alles NULL.
      </PRE>

      hast du noch eine Idee, oder habe ich evtl. irgendwo einen dummen Fehler gemacht?

      Bye - Pete

      Comment


      • #4
        Hi,

        für alle die es interessiert:

        HANDLE PrnHandle;
        DWORD size;
        PRINTER_INFO_2 *pBuffer;
        char ADevice[256],ADriver[256],APort[256];
        int ADeviceMode;
        // erstmal den Namen holen
        Printer()->GetPrinter(ADevice, ADriver, APort, ADeviceMode);

        if (OpenPrinter(ADevice,&PrnHandle,NULL) != 0)
        { // Größe des notwendigen Buffers nach "size" lesen
        GetPrinter(PrnHandle, 2, NULL, 0, &size);
        pBuffer = (PRINTER_INFO_2*)malloc(size);
        // Daten des Druckers holen
        if (GetPrinter(PrnHandle, 2, (unsigned char*)pBuffer, size, &size))
        { PRINTER_INFO_2 *ptr = pBuffer;

        if (ptr->pPrinterName != "")
        Label1->Caption = ptr->pPrinterName;
        if (ptr->pPortName != "")
        Label2->Caption = ptr->pPortName;
        if (ptr->pDriverName != "")
        Label3->Caption = ptr->pDriverName;
        if (ptr->pComment != "")
        Label4->Caption = ptr->pComment;
        }
        else ErrMsg ("GetPrinter");
        free(pBuffer);
        }

        Bye - Pete

        Comment

        Working...
        X