Drucker Installation über windows api



  • Hallo Leute,

    ich ahbe einen fertigen printer port monitor, der mit dem standard xps drucker (eigene ind datei) arbeitet. Diesen Treiber gibt es als 32 und 63 Bit variante mit inf's für die Druckerinstallation und Monitorinstallation (über Druckereinstellungen ist die Installation kein Problem).

    Jetzt möchte ich mir ein setup dafür bauen. und es gibt ja verschiedene Windows API funktinen um einen drucker zu installieren.

    Welche benötige ich? Und in welcher Reihenfolge? Und laufen die auch unter XP

    1. AddMonitor
    2. AddPort
    3. AddPrinterDriver
    4. AddPrinter

    Wann Kopiere ich die Dll's? Wie läuft es wenn ich einen Treiber updaten will, der Spooler sperrt ja die Dlls rufe ich dann hier erst alle funktionen mit delete auf?

    Bin für jede Antwort dankbar.

    MfG


  • Mod

    Schon mal die Doku gelesen zu AddPrinterDriver?
    http://msdn.microsoft.com/en-us/library/windows/desktop/dd183346(v=vs.85).aspx

    Before an application calls the AddPrinterDriver function, all files required by the driver must be copied to the system's printer-driver directory. An application can retrieve the name of this directory by calling the GetPrinterDriverDirectory function.

    Wenn Du einen Installer bnutzt ist das doch wurscht oder, wenn Du einen Update machst. Der merkt das doch.,

    Zudem blockiert der Spooler Deinen Druckertreiber nicht soweit ich weiß. Nur wenn er ihn auch brauchtlädt er ihn.

    Ansonsten MoveFileEx mit MOVEFILE_DELAY_UNTIL_REBOOT...





  • Hallo Leute,

    also meine inf section für den Treiber sieht so aus:

    [INSTALL_MBXPS_FILTERS_PRE_VISTA]
    CopyFiles=DrvFiles
    DriverFile=mxdwdrv.dll
    PrintProcessor="MS_XPS,filterpipelineprintproc.dll"
    ConfigFile=UniDrvUI.dll
    HelpFile=UniDrv.HLP
    DataFile=MBPrinterDrv.gpd
    Include=NTPRINT.INF, MSXPSDRV.INF
    Needs=UNIDRV.OEM, XPSGPD.OEM, XPSDRV.OEM
    CopyINF=MBPrinterDrv.inf
    
    [INSTALL_MBXPS_FILTERS_VISTA]
    CopyFiles=DrvFiles
    DriverFile=mxdwdrv.dll
    ConfigFile=UniDrvUI.dll
    HelpFile=UniDrv.HLP
    DataFile=MBPrinterDrv.gpd
    CoreDriverSections="{D20EA372-DD35-4950-9ED8-A6335AFE79F0},UNIDRV.OEM", "{D20EA372-DD35-4950-9ED8-A6335AFE79F5},XPSDRV.OEM,XPSGPD.OEM"
    
    [DrvFiles]
    MBPrinterDrv.gpd
    MBPrinterDrv-PipelineConfig.xml
    

    Diese installation möchte ich jetzt mit AddPrinterDriverEx installieren.

    BOOL AddPrinterDriverEx(
      __in     LPTSTR pName,
      __in     DWORD Level,
      __inout  LPBYTE pDriverInfo,
      __in     DWORD dwFileCopyFlags
    );
    

    wobei ich da level 8 beutze muß? Die Strucktur sieht so aus.

    typedef struct _DRIVER_INFO_8 {
      DWORD     cVersion;
      LPTSTR    pName;
      LPTSTR    pEnvironment;
      LPTSTR    pDriverPath;
      LPTSTR    pDataFile;
      LPTSTR    pConfigFile;
      LPTSTR    pHelpFile;
      LPTSTR    pDependentFiles;
      LPTSTR    pMonitorName;
      LPTSTR    pDefaultDataType;
      LPTSTR    pszzPreviousNames;
      FILETIME  ftDriverDate;
      DWORDLONG dwlDriverVersion;
      LPTSTR    pszMfgName;
      LPTSTR    pszOEMUrl;
      LPTSTR    pszHardwareID;
      LPTSTR    pszProvider;
      LPTSTR    pszPrintProcessor;
      LPTSTR    pszVendorSetup;
      LPTSTR    pszzColorProfiles;
      LPTSTR    pszInfPath;
      DWORD     dwPrinterDriverAttributes;
      LPTSTR    pszzCoreDriverDependencies;
      FILETIME  ftMinInboxDriverVerDate;
      DWORDLONG dwlMinInboxDriverVerVersion;
    } DRIVER_INFO_8, *PDRIVER_INFO_8, *LPDRIVER_INFO_8;
    

    Jetzt ist die Frage was muß ich wo angeben:

    pDriverPath = mxdwdrv.dll
    pDataFile = MBPrinterDrv.gpd
    pConfigFile = UniDrvUI.dll
    pHelpFile = UniDrv.HLP
    pDependentFiles = CopyFiles
    ...
    pszPrintProcessor = "MS_XPS,filterpipelineprintproc.dll" (in der win32 variante)

    Wo gebe ich jetzt die CoreDriverSections sowie Include, Needs und CopyINF einträge an?

    MfG


  • Mod

    Nö.. Das sollst Du nciht. Das kanst Du machen wenn Du eine erhöhte Flexibilität benötigst. Warum musst Du Level 8 Nehmen.
    Nimm AddPrinterDriver(Ex) und DRIVER_INFO_2.



  • ich habe nur die 8 genommen wegen dem pszPrintProcessor

    und wo trage ich die Werte

    Include=NTPRINT.INF, MSXPSDRV.INF
    Needs=UNIDRV.OEM, XPSGPD.OEM, XPSDRV.OEM
    CopyINF=MBPrinterDrv.inf

    sowie die Werte

    CoreDriverSections="{D20EA372-DD35-4950-9ED8-A6335AFE79F0},UNIDRV.OEM", "{D20EA372-DD35-4950-9ED8-A6335AFE79F5},XPSDRV.OEM,XPSGPD.OEM"

    ein?

    MfG


  • Mod

    Ich weiß nicht was Dumit diesen Infos willst. Du willst doch nur den Treibrinstallieren.
    Benötigst Du dieseInfos aus der INF Datei, oder nicht?



  • also bei denen bin ich mir nicht sicher ob ich sie brauche:

    Include=NTPRINT.INF, MSXPSDRV.INF
    Needs=UNIDRV.OEM, XPSGPD.OEM, XPSDRV.OEM
    CopyINF=MBPrinterDrv.inf

    die waren halt für xp in der sample inf und da hab ich sie übernommen.

    Wie gibt man die Driver Version (dwlDriverVersion)? Im inf sieht das ja so aus:

    DriverVer=15/05/2012,1.0.0.53

    Wie mache ich daraus eine Zahl (dwlDriverVersion)?

    MfG


  • Mod

    Warum füllst Du die Version 2 nicht aus und machst es einfrahc.

    Was ist Dein Problem, was gbt es für Fehler, was hat die INF Datei damit zu tun?

    Ansonsten:
    http://stackoverflow.com/questions/3158575/how-to-add-additional-printer-drivers-x86-x64-programmatically-under-windows-x



  • also konkret mache ich das jetzt so:

    memset(&DriverInfo,0,sizeof(DriverInfo));
    		DriverInfo.cVersion = 3;
    		DriverInfo.pName = DRIVER_NAME;
    		DriverInfo.pEnvironment = (bIsWin64)?__T("Windows x64"):__T("Windows x86");
    		DriverInfo.pDriverPath = __T("mxdwdrv.dll");
    		DriverInfo.pDataFile = __T("MBPrinterDrv.gpd");
    		DriverInfo.pConfigFile = __T("UniDrvUI.dll");
    		DriverInfo.pHelpFile = __T("UniDrv.HLP");
    		DriverInfo.dwlDriverVersion = (((DWORDLONG)MAJOR)<<48) | (((DWORDLONG)MINOR)<<32) | (((DWORDLONG)SUBVERSION)<<16) | ((DWORDLONG)BUILD);
    		if (hTemp = CreateFile(pFile,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL))
    		{
    			GetFileTime(hTemp,&DriverInfo.ftDriverDate,NULL,NULL);
    			CloseHandle(hTemp);
    		}
    		if (!bIsPreVista)
    		{
    			DriverInfo.pszzCoreDriverDependencies = __T("{D20EA372-DD35-4950-9ED8-A6335AFE79F0},UNIDRV.OEM\0D20EA372-DD35-4950-9ED8-A6335AFE79F5},XPSDRV.OEM,XPSGPD.OEM\0\0");
    		}
    		else
    		{
    
    		}
    
    		if (!AddPrinterDriverEx(NULL,8,(LPBYTE)&DriverInfo,APD_COPY_NEW_FILES))
    			eError = EC_CantAddDriver;
    		ulTemp = GetLastError();
    

    und er meldet ERROR_INVALID_PARAMETER.

    MfG


  • Mod

    Was soll der Quatsch. DRIVER_INFO_3 hat kein Feld pszzCoreDriverDependencies!



  • Hallo Martin,

    in der Dokumentation steht bei jedem Strukturtyp

    cVersion - The operating system version for which the driver was written. The supported value is 3

    wenn ich die Zeile

    // DriverInfo.pszzCoreDriverDependencies = __T("{D20EA372-DD35-4950-9ED8-A6335AFE79F0},UNIDRV.OEM\0D20EA372-DD35-4950-9ED8-A6335AFE79F5},XPSDRV.OEM,XPSGPD.OEM\0\0");
    

    weglasse erscheint der Treiber schonmal im printer management. Nur AddPrinter hat dann die Fehlermeldung: ERROR_FILE_CORRUPT

    memset(&PrinterAddInfo,0,sizeof(PrinterAddInfo));
    		PrinterAddInfo.pPrinterName = PRINTER_NAME;
    		PrinterAddInfo.pPortName = (pPortName)?pPortName:DEFAULT_PORTNAME;
    		PrinterAddInfo.pDriverName = DRIVER_NAME;
    		PrinterAddInfo.pPrintProcessor = __T("WinPrint");
    		if (hPrinter = AddPrinter(NULL,2,(LPBYTE)&PrinterAddInfo))
    		{
    			ClosePrinter(hPrinter);
    		}
    		else eError = EC_CantAddPrinter;
    

    hat jemand noch eine Idee?

    Oder weiß jemand was diese Inf File einträge bedeuten?

    Include=NTPRINT.INF, MSXPSDRV.INF
    Needs=UNIDRV.OEM, XPSGPD.OEM, XPSDRV.OEM
    CopyINF=MBPrinterDrv.inf
    CoreDriverSections="{D20EA372-DD35-4950-9ED8-A6335AFE79F0},UNIDRV.OEM", "{D20EA372-DD35-4950-9ED8-A6335AFE79F5},XPSDRV.OEM,XPSGPD.OEM"

    MfG


  • Mod

    Würest Du mal etwas mehr Code zeigen.
    Wo ist die Definition der Struktur?
    Wo ist die wichtigste Info: pDriverPath?

    Irgendwie verstehe ich überhaupt nicht wie Du vorgehst.



  • Hallo Maritn,

    also ich möchte den Treiber intallieren / updaten mit AddPrinterDriverEx und danach falls kein drucker mit dem Treiber installiert ist einen mit AddPritner installieren.

    PRINTER_INFO_2 PrinterAddInfo;
    

    alle anderen member sind 0 durch das memset. Welche werden noch benötigt?

    MfG


  • Mod

    Ähhhh.. kannst Du lesen was ich Dir geschreiben habe? 👎



  • sorry

    PRINTER_INFO_2 PrinterAddInfo;
    

    http://msdn.microsoft.com/en-us/library/windows/desktop/dd162845(v=vs.85).aspx

    pDriverPath hat diese Strucktur nicht.

    MfG


  • Mod

    Und warum benutzt Du nicht AddPrinterDriver?
    Damit hast Du angefangen:
    http://msdn.microsoft.com/en-us/library/windows/desktop/dd162502(v=vs.85).aspx



  • addprinterdriver installiert nur den treiber das klapt jetzt.

    Jetzt muß ich noch den drucker hinzufügen also addprinter



  • damit ging es:

    PRINTER_INFO_2 PrinterAddInfo;
    	DRIVER_INFO_6 DriverInfo;
    
    		memset(&DriverInfo,0,sizeof(DriverInfo));
    		DriverInfo.cVersion = 3;
    		DriverInfo.pName = DRIVER_NAME;
    		DriverInfo.pEnvironment = NULL;//(bIsWin64)?__T("Windows x64"):__T("Windows x86");
    		DriverInfo.pDriverPath = __T("mxdwdrv.dll");
    		DriverInfo.pDataFile = __T("MBPrinterDrv.gpd");
    		DriverInfo.pConfigFile = __T("UniDrvUI.dll");
    		DriverInfo.pHelpFile = __T("UniDrv.HLP");
    		DriverInfo.pDependentFiles = __T("MBPrinterDrv-PipelineConfig.xml\0UNIDRV.DLL\0UNIRES.DLL\0STDNAMES.GPD\0STDDTYPE.GDL\0STDSCHEM.GDL\0STDSCHMX.GDL\0XPSSVCS.DLL\0MSXPSINC.GPD\0\0");
    		DriverInfo.pszMfgName = COMPANY;
    		DriverInfo.pszProvider = COMPANY;
    		//DriverInfo.pszPrintProcessor = __T("winprint");
    		DriverInfo.dwlDriverVersion = (((DWORDLONG)MAJOR)<<48) | (((DWORDLONG)MINOR)<<32) | (((DWORDLONG)SUBVERSION)<<16) | ((DWORDLONG)BUILD);
    		if (hTemp = CreateFile(pFile,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL))
    		{
    			GetFileTime(hTemp,&DriverInfo.ftDriverDate,NULL,NULL);
    			CloseHandle(hTemp);
    		}
    
    		if (!AddPrinterDriverEx(NULL,6,(LPBYTE)&DriverInfo,APD_COPY_ALL_FILES))
    			eError = EC_CantAddDriver;
    
    		memset(&PrinterAddInfo,0,sizeof(PrinterAddInfo));
    		PrinterAddInfo.pPrinterName = PRINTER_NAME;
    		PrinterAddInfo.pPortName = (pPortName)?pPortName:DEFAULT_PORTNAME;
    		PrinterAddInfo.pDriverName = DRIVER_NAME;
    		PrinterAddInfo.pPrintProcessor = __T("winprint");
    		if (hPrinter = AddPrinter(NULL,2,(LPBYTE)&PrinterAddInfo))
    		{
    			ClosePrinter(hPrinter);
    		}
    		else eError = EC_CantAddPrinter;
    


  • Hallo Leute,

    ich muß nioch mal dauf zurückkomen. Die Obige Version funktioniert unter Windows 7 64 Bit.

    Unter XP habe ich immer den Fehler bei AddPrinterDriverEx:

    ERROR_FILE_NOT_FOUND
    2 (0x2)
    The system cannot find the file specified.

    nur wenn ich die Datein in Windows/System32/ von had Suche sind alle vorhanden. Wie kann ich herausfinden welche Datei jetzt fehlt

    MfG


Anmelden zum Antworten