Drucker Installation über windows api





  • 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



  • also in der Inf steht das und es funktioniert:

    [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
    

    aber warum dann gerade eine Datei FEhlt verstehe ich nicht


Anmelden zum Antworten