|
Тема
|
WinXP, D7, AddPrinterDriver - как се ползва?
|
|
Автор |
NikB (член) |
Публикувано | 08.08.09 13:42 |
|
WinXP, D7, AddPrinterDriver - как се ползва?
Искам да добавя драйвер: "Generic / Text Only"
(Ако в Win поне веднъж е инсталиран тоя драйвер - няма проблем.)
Ако драйверът поне веднъж е инсталиран, енумераторът на драйверите връща нещо такова (и няма проблем):
cVersion: 3
pName: Generic / Text Only
pEnvironment: Windows NT x86
pDriverPath: C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\UNIDRV.DLL
pDataFile: C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\TTY.GPD
pConfigFile: C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\UNIDRVUI.DLL
Интересува ме някой пример за AddPrinterDriver:
AddPrinterDriver(pName: PChar; Level: DWORD; pDriverInfo: Pointer): BOOL; stdcall;
Как да определя кое е оптималния Level, как да запълня pDriverInfo?
Пробата ми дава грешка 1801: "[color="#8B0000"]The printer name is invalid[/color]" - кофти работа!
Ето я пробата (Гледайки примера на и резултатите от ръчно инсталиран "Generic / Text Only" драйвер):
Това кодче
{}procedure TfrmMain.Button1Click(Sender: TObject);
var
xDriverInfo: pDriverInfo2;
begin
New( xDriverInfo);
xDriverInfo.cVersion := 3;
xDriverInfo.pName := PChar( 'Generic / Text Only');
xDriverInfo.pEnvironment := PChar( 'Windows NT x86');
xDriverInfo.pDriverPath := PChar( 'C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\UNIDRV.DLL');
xDriverInfo.pDataFile := PChar( 'C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\TTY.GPD');
xDriverInfo.pConfigFile := PChar( 'C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\UNIDRVUI.DLL');
if AddPrinterDriver( 'Generic / Text Only', 2, xDriverInfo) then begin
StatusBar1.SimpleText := 'OK';
end else begin
StatusBar1.SimpleText := IntToStr( GetLastError)+': '+SysErrorMessage( GetLastError);
end;
end;
Редактирано от NikB на 08.08.09 19:34.
| |
Тема
|
Re: WinXP, D7, AddPrinterDriver - как се ползва?
[re: NikB]
|
|
Автор | Ивaнчo (Нерегистриран) |
Публикувано | 11.08.09 20:16 |
|
Пропуснал си може би една малка подробност от описанието на функцията - Before an application calls the AddPrinterDriver function, all files required by the driver must be copied to the system's printer-driver directory.
Затова и когато вече веднъж е бил инсталиран ръчно, не получаваш грешки. Например, файла TTY.GPD на "чист компютър" го няма в C:\WINDOWS\System32\spool\DRIVERS\W32X86\3 - GetPrinterDriverDirectory
А на следващия въпрос - как да зная кои файлове са към определен драйвер - виж, това не знам
Иначе, TTY.GPD се намира в C:\WINDOWS\Driver Cache\i386\driver.cab , така че ще трябва да намериш как да го екстрактнеш от там, и да го копираш до Printer Driver Directory . За Vista, доколкото си спомням, драйверите бяха в някаква друга директория, а не в driver.cab
| |
Тема
|
GetPrinterDriverDirectory
[re: Ивaнчo]
|
|
Автор |
NikB (член) |
Публикувано | 12.08.09 19:54 |
|
За да стане работата, трябва да определя GetPrinterDriverDirectory.
Това става с двукратно викане - първо, с дължина на структурата 0, за да видим колко е желаната от Бил Гейтс дължина и след това - указател към свободна памет с тоя размер.
Викам онова по-долу и ми връща стринг
'C:\WINDOWS\System32\spool\DRIVERS\W32X86'
който е с дължина 35 (около) байта, а ми иска да заделям 82 байта.
Изглежда ми странно - ИМА ЛИ НЯКАКВО ОБЯСНЕНИЕ?
iCnt := 0;
GetPrinterDriverDirectory( '', '', 1, @s, 0, i);
if i>0 then begin
iCnt := i;
GetMem( pDir, iCnt);
try
if GetPrinterDriverDirectory( '', '', 1, pDir, iCnt, iCnt) then begin
s := string( pDir);
end;
finally
FreeMem( pDir, i);
end;
end;
| |
Тема
|
Може ли многократно да правя AddPrinterDriver
[re: Ивaнчo]
|
|
Автор |
NikB (член) |
Публикувано | 12.08.09 19:58 |
|
Може ли многократно да правя AddPrinterDriver на един и същ драйвер?
да не би това да е проблема?
| |
|
Не е 35, а 40. Плюс един за терминатора (0), по две за уникода прави 82 байта
Linux isn't free, it's worthless.
| |
|
3 пъти ги четох снощи - бяха 35 (около) :), днес са 40 (юникодето, да :))
| |
|
|
|
|