powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как программно найти и установить стандартные файлы принтера?
3 сообщений из 3, страница 1 из 1
Как программно найти и установить стандартные файлы принтера?
    #35814603
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При установке некоего принтера требуются стандартные файлы.
unidrv.hlp
unidrv.dll
unidrvui.dll
unires.dll
stdnames.gpd

Где они лежат, на пальцах понятно.
C:\WINDOWS\Driver Cache\i386\driver.cab
либо на диске виндов.

С ф-циями winspool.dll AddMonitor/Port/PrinterDriver/Printer я разобрался, все замечательно.
Если вышеуказанные файлы в системе есть, проблем тоже не возникает,
но если они не установлены, то надо найти архив/предложить вставить диск и из понятной папки устанавливать драйвер принтера.

Как подойти к вопросу? Один из вариантов тупо бухнуть все это хозяйство в дистрибутив программы, тогда надо думать проблем не возникнет, но это сдается мне, дурной тон, ибо файлы стандартные и по определению присутствуют на диске виндоус.

Как быть? Или есть стандартные API на тему поиска в системе и извлечения из CAB?

Дабы не быть голословным и не производить впечатление, что я тупой, вот код VB, кот.устанавливает у меня дравер принтера.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
Function PrinterDriver(InstallTyp As eInstall) As Long
    Dim DI3 As DRIVER_INFO_3, Driverpath As String, res As Long
    Dim lngDriverDirectoryLevel    As Long
    Dim lngDriverDirectoryNeeded   As Long
    Dim bytDriverDirectoryBuffer() As Byte
    Dim strDriverDirectory         As String *  512 
    Dim lngWin32apiResultCode      As Long
    Dim tStr As String
    Select Case InstallTyp
        Case  0 : ' Install
            tStr = "Install"
            lngDriverDirectoryLevel =  1 
            lngWin32apiResultCode = GetPrinterDriverDirectory(vbNullString, vbNullString, lngDriverDirectoryLevel, ByVal vbNullString,  0 , lngDriverDirectoryNeeded)
            ReDim bytDriverDirectoryBuffer(lngDriverDirectoryNeeded -  1 )
            lngWin32apiResultCode = GetPrinterDriverDirectory(vbNullString, vbNullString, lngDriverDirectoryLevel, bytDriverDirectoryBuffer( 0 ), lngDriverDirectoryNeeded, lngDriverDirectoryNeeded)
            lngWin32apiResultCode = lstrcpy(ByVal strDriverDirectory, bytDriverDirectoryBuffer( 0 ))
            
            Driverpath = Left(strDriverDirectory, InStr(strDriverDirectory, vbNullChar) -  1 )
            If Right(Driverpath,  1 ) <> "\" Then Driverpath = Driverpath & "\"
            
            With DI3
                .pName = "MyDriver" & vbNullString
                .cVersion =  1 
                .pConfigFile = Driverpath & "unidrvui.dll" & vbNullString
                .pDataFile = Driverpath & "MYUni.GPD" & vbNullString
                .pDriverPath = Driverpath & "unidrv.dll" & vbNullString
                .pEnvironment = vbNullString
                .pHelpFile = Driverpath & "unidrv.hlp" & vbNullString
                .pDependentFiles = Driverpath & "MYuni.dll" & Chr$( 0 ) & Driverpath & "unires.dll" & Chr$( 0 ) & Driverpath & "STDNAMES.GPD" & vbNullString & vbNullString
                .pMonitorName = vbNullString
                .pDefaultDataType = "RAW" & vbNullString
            End With
            res = AddPrinterDriver(vbNullString,  3 , DI3)
        Case  1 : ' UnInstall
            tStr = "UnInstall"
            res = DeletePrinterDriver(vbNullString, vbNullString, "MyDriver" & vbNullString)
    End Select
    PrinterDriver = res
End Function

Private Type DRIVER_INFO_3
  cVersion As Long
  pName As String
  pEnvironment As String
  pDriverPath As String
  pDataFile As String
  pConfigFile As String
  pHelpFile As String
  pDependentFiles As String
  pMonitorName As String
  pDefaultDataType As String
End Type

Public Enum eInstall
 Install =  0 
 UnInstall =  1 
End Enum

Public Declare Function GetPrinterDriverDirectory Lib "winspool.drv" Alias "GetPrinterDriverDirectoryA" _
(ByVal pName As String, ByVal pEnvironment As String, ByVal Level As Long, pDriverDirectory As Any, ByVal cdBuf As Long, pcbNeeded As Long) As Long
Public Declare Function AddPrinterDriver Lib "winspool.drv" Alias "AddPrinterDriverA" _
(ByVal pName As String, ByVal Level As Long, pDriverInfo As Any) As Long
...
Рейтинг: 0 / 0
Как программно найти и установить стандартные файлы принтера?
    #35814756
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажем так, я нашел лог программы, кот. это делает и с кот. я это делаю по образу и подобию:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
 SystemDirectory: C:\WINDOWS\system32\
DriverDirctory: C:\WINDOWS\System32\spool\DRIVERS\W32X86\
SystemInstallPath: G:\
ServicePackSourcePath: c:\windows\ServicePackFiles\
DriverCachePath: C:\WINDOWS\Driver Cache\
FileAge:  21 . 01 . 2009   10 : 40 : 10 
Operation System: Windows XP
Starting printer installation
 Language: English
  System: WinNT/2K/XP/ 2003 /Vista
  Calling AddMonitor... Done
  System: Win2K/XP/ 2003 
  Deteling file C:\WINDOWS\System32\spool\DRIVERS\W32X86\unidrv.dll
  File C:\WINDOWS\System32\spool\DRIVERS\W32X86\unidrv.dll not exists
  Deteling file C:\WINDOWS\System32\spool\DRIVERS\W32X86\unires.dll
  File C:\WINDOWS\System32\spool\DRIVERS\W32X86\unires.dll not exists
...
  Search unidrv.dll in C:\WINDOWS\Driver Cache\i386\
  unidrv.dll found in sp3.cab
  Running: extrac32.exe /e /y /l "C:\WINDOWS\System32\spool\DRIVERS\W32X86\" "C:\WINDOWS\Driver Cache\i386\sp3.cab" unidrv.dll
  Running... Done. Result:  0 
  Search unires.dll in C:\WINDOWS\Driver Cache\i386\
  unires.dll found in sp3.cab
  Running: extrac32.exe /e /y /l "C:\WINDOWS\System32\spool\DRIVERS\W32X86\" "C:\WINDOWS\Driver Cache\i386\sp3.cab" unires.dll
  Running... Done. Result:  0 
...
  Calling AddPrinterDriverEx... Done.
  Deteling file C:\WINDOWS\System32\spool\DRIVERS\W32X86\unidrv.dll
  Deteling C:\WINDOWS\System32\spool\DRIVERS\W32X86\unidrv.dll done
  Deteling file C:\WINDOWS\System32\spool\DRIVERS\W32X86\unires.dll
  Deteling C:\WINDOWS\System32\spool\DRIVERS\W32X86\unires.dll done
...
  Calling AddPrinter... Done.
  Calling ClosePrinter... Done.
Printer installation attempt completed.

Отсюда следует ряд ответов и вытекает ряд вопросов.
1)DriverCachePath -как найти через API?
2) Как найти нужный файл в cab-архиве и по какому принципу перебирать sp3.cab, sp2.cab и driver.cab? Понятно, что в sp3 сидит более новый драйвер, кот.прога и хочет оприходовать...
3)ServicePackSourcePath -что-то я там драйверов не вижу..Зачем это ей?
4) Как распаковать... Ну ответ на блюдечке в лог файле.
Код: plaintext
Running: extrac32.exe /e /y /l "C:\WINDOWS\System32\spool\DRIVERS\W32X86\" "C:\WINDOWS\Driver Cache\i386\sp3.cab" unidrv.dll
5) Как дальше требовать CD-шник? Ну, наверно убрать CASH и посмотреть чего станет писать "умный лог", для начала.

Попробую еще через HEX посмотреть какие dll прога пользует, м.б. удастся найти API,
Нашелтут универсальный метод искать ф-ции в dll-ах
Код: plaintext
Dumpbin /EXPORTS  подопытная.dll  >  output.txt
а потом тупо рыть google: <ф-ция> <API> <Visual Basic>, частенько помогает искать грамотные решения...
некот. ф-ции можно сразу через rundll32.exe тупо запускать, но это если без параметров
...
Рейтинг: 0 / 0
Как программно найти и установить стандартные файлы принтера?
    #35820136
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отсюда следует ряд ответов и вытекает ряд вопросов.
1) DriverCachePath -как найти через API?
Код: plaintext
GetRegValue(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Setup", "DriverCachePath", "")
Нет другого способа.
2) Как найти нужный файл в cab-архиве и по какому принципу перебирать sp3.cab, sp2.cab и driver.cab? Понятно, что в sp3 сидит более новый драйвер, кот.прога и хочет оприходовать...
Класс CABfile -мудрено, но прилично,разобрался.
http://www.thescarms.com/vbasic/cabexplorer.aspx
Но можно использовать extrac.exe из комплекта Win98 , он читает содержимое архивов и может вернуть результат в текстовой файл. С учетом сложности реализации класса, м.б. это и не хуже.
Тупо ищем все файлы в папках и архивах в заданном месте, сортируем по дате, выбираем свежий
3) ServicePackSourcePath ...
То же что и пп.1
4) Как распаковать... Ну ответ на блюдечке в лог файле.
Код: plaintext
Running: extrac32.exe /e /y /l "C:\WINDOWS\System32\spool\DRIVERS\W32X86\" "C:\WINDOWS\Driver Cache\i386\sp3.cab" unidrv.dll
Да, распаковывать проще и красивше именно так, паравоз изобретать ни к чему.
5) Как дальше требовать CD-шник?
Код: plaintext
SetupDiskPrompt("drvindex.inf", "Windows installation disk", , SystemInstallPath & "i386\")
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как программно найти и установить стандартные файлы принтера?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]