Консультация № 171270
12.08.2009, 21:42
0.00 руб.
0 7 0
Здравствуйте уважаемые эксперты. Помогите разобраться, пожалуйста (и извините моего русского языка!)
Как я могу програмно дабавит Generic Text Driver (если его нет)? (В приложение - как я вижу список драйверов и как удаляю из списка выбраной драйвер)

Приложение:
{}procedure TFormMain_PrinterDriver.Button_ListDrvClick(Sender: TObject);
var
i, bytesNeeded: DWORD;
xDriverInfo: pDriverInfo2;
NumDrivers: DWORD;
begin
ListBox_PrinterDrivers.Clear;
// get number of installed drivers
Numdrivers := 0;
bytesNeeded := 0;
EnumPrinterDrivers(nil, nil, 2, nil, 0, bytesNeeded, NumDrivers);
if bytesNeeded = 0 then begin
ShowMessage('No printer drivers installed!');
Exit;
end;

FreeAndNil( xEnumDriversData);
// allocate memory for the driver data
GetMem( xEnumDriversData, bytesNeeded);
// fetch driver data
if EnumPrinterDrivers(nil, nil, 2, xEnumDriversData, bytesNeeded, bytesNeeded, NumDrivers) then begin
// add drivers to ListBox_PrinterDrivers
xDriverInfo := xEnumDriversData;
for i := 1 to NumDrivers do begin
ListBox_PrinterDrivers.Items.AddObject( xDriverInfo^.pName, TObject(xDriverInfo));
Inc(xDriverInfo); // Note: Inc increments a pointer by the size of its base type!
end;
ListBox_PrinterDrivers.ItemIndex := 0;
ListBox_PrinterDriversClick( ListBox_PrinterDrivers);
end else begin
RaiseLastWin32Error;
end;
end;
{}procedure TFormMain_PrinterDriver.ListBox_PrinterDriversClick(Sender: TObject);
var
xDriverInfo: pDriverInfo2;
begin
with Sender as TListbox do begin
if ItemIndex >= 0 then begin
Memo_PrinterInfo.Clear;
xDriverInfo := PDriverInfo2(Items.Objects[ItemIndex]);
with Memo_PrinterInfo.Lines, xDriverInfo^ do begin
Add(Format('cVersion: %d', [ cVersion]));
Add(Format('pName: %s', [ pName]));
Add(Format('pEnvironment: %s', [ pEnvironment]));
Add(Format('pDriverPath: %s', [ pDriverPath]));
Add(Format('pDataFile: %s', [ pDataFile]));
Add(Format('pConfigFile: %s', [ pConfigFile]));
end;
end;
end;
end;
{}procedure TFormMain_PrinterDriver.Button_DelDriverClick(Sender: TObject);
var
xDriverInfo: pDriverInfo2;
begin
if ListBox_PrinterDrivers<>nil then begin
if ListBox_PrinterDrivers.ItemIndex >= 0 then begin
xDriverInfo := PDriverInfo2( ListBox_PrinterDrivers.Items.Objects[ ListBox_PrinterDrivers.ItemIndex]);
end;
end;
if DeletePrinterDriver( '', xDriverInfo.pEnvironment, xDriverInfo.pName) then begin
StatusBar1.SimpleText := 'OK';
StatusBar1.ParentColor := true;
ListBox_PrinterDrivers.Items.Delete( ListBox_PrinterDrivers.ItemIndex);
end else begin
StatusBar1.Color := $C0C0FF;
StatusBar1.SimpleText := IntToStr( GetLastError)+': '+SysErrorMessage( GetLastError);
end;
end;

Обсуждение

Неизвестный
15.08.2009, 19:58
общий
Сделал попытку ползоват в Делфи 7 функсию AddPrinterDriverEx, но не успел сделать связ с ней (она находится в winspool.drv?)

{$EXTERNALSYM AddPrinterDriverEx}
function AddPrinterDriverEx( pName: PChar; Level: DWORD; pPrinter: Pointer; dwFileCopyFlags: DWORD): BOOL; stdcall;

implementation

const
winspl = 'winspool.drv';

function AddPrinterDriverEx; external winspl name 'AddPrinterDriverEx';
Неизвестный
17.08.2009, 10:25
общий
Вы на правильном пути. Согласно MSDN, именно так и добавляются драйверы принтера. И да, она находится в winspool.drv.
Неизвестный
17.08.2009, 10:34
общий
Цитата: 57185
Вы на правильном пути
:), спасибо :). На первом begin в dpr файле вылетает AV :(
Неизвестный
18.08.2009, 10:08
общий
Можно посоветовать проверить все блоки инициализации - поставить отладочные выдачи в них и посмотреть цепочку инициализаций - если там проблема отладчик обычно часто именно на begin в dpr файле останавливается.

А может это срабатывает защита от отладчика - у меня такой эффект бывал при работе с кодеками DirectShow - без IDE все работает, под отладчиком то виснет, то где попало прерывается.
Неизвестный
18.08.2009, 10:19
общий
Спасибо, я знаю, что AV появляется, когда в проект у меня этот фрагмент (но не знаю как с ним боротся :)):
(Впрочем я часто смотрел "цепочку инициализаций" - F7 на первой begin, но сейчас с первого F7 и вылетает AV :()
{$EXTERNALSYM AddPrinterDriverEx}
function AddPrinterDriverEx( pName: PChar; Level: DWORD; pPrinter: Pointer; dwFileCopyFlags: DWORD): BOOL; stdcall;
implementation
const
winspl = 'winspool.drv';
function AddPrinterDriverEx; external winspl name 'AddPrinterDriverEx';
Неизвестный
18.08.2009, 16:44
общий
А вы буковку забыли похоже в конце при связывании:

function AddPrinterDriverEx; external winspl name 'AddPrinterDriverExA';

Почти все функции с параметрами-строками имеют в Win32 две модификации с A и c W в конце. Попробуйте так описать. А без буквы действительно все происходит как у вас.
Неизвестный
18.08.2009, 16:51
общий
Я НЕ ЗАБыЛ, Я НЕ ЗНАЛ, не уведел и не проверил :)!
Болшое СПАСИБО!
Форма ответа