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. AddPrinterWann 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
-
Schon mal die Doku gelesen zu AddPrinterDriver?
http://msdn.microsoft.com/en-us/library/windows/desktop/dd183346(v=vs.85).aspxBefore 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
-
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.infsowie die Werte
CoreDriverSections="{D20EA372-DD35-4950-9ED8-A6335AFE79F0},UNIDRV.OEM", "{D20EA372-DD35-4950-9ED8-A6335AFE79F5},XPSDRV.OEM,XPSGPD.OEM"
ein?
MfG
-
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.infdie 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
-
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?
-
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
-
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
-
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
-
Ä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
-
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