Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему не определяется принтер??? [D5, D6, Win95/98, Win2k]


Sirus ©   (2003-04-08 13:17:00) 

Привет Мастера...
Есть вопрос: Делаю так...

procedure TForm1.Button1Click(Sender: TObject);
var PInfo: array [0..9] of TPrinterInfo2;
PBuf, BNeed, PCount:DWord;
begin
If EnumPrinters(PRINTER_ENUM_NAME, nil, 2, @PInfo, SizeOf(PInfo), BNeed, PCount) then begin
ShowMessage("Found");
ShowMessage(IntToStr(BNeed));
ShowMessage(IntToStr(PCount));
end;
end;

Однако принтер не хотят определятся...
ShowMessage(IntToStr(BNeed));
ShowMessage(IntToStr(PCount));
Сообщают цифру 0
Где ошибка???


tret   (2003-04-29 13:20:00) [1]

var PInfo: ^TPrinterInfo2;
PBuf, BNeed, PCount:DWord;
PHandle:THandle;
Flags:Dword;
begin
PCount:=0;
BNeed:=0;
Flags:=PRINTER_ENUM_CONNECTIONS;
If EnumPrinters(Flags, nil, 2, PInfo, 0, BNeed, PCount) then begin end;
PBuf:=Bneed;
GetMem(PInfo,PBuf);
If EnumPrinters(Flags, nil, 2, PInfo, PBuf, BNeed, PCount) then
begin
if OpenPrinter(PInfo.pPrinterName, PHandle, nil) then begin
ShowMessage(PInfo.pShareName);
ShowMessage(PInfo.pServerName);
FreeMem(PInfo);
ClosePrinter(PHandle);
end;
end;


Sirus   (2003-04-11 07:27:00) [2]

Ошибка исчезла сама собой... (Никаких изменений в коде не было)... По моему комп и программа должны были привыкнуть что к ним так обращаются... :))))


Cobalt   (2003-04-10 12:49:00) [3]

Может, хендл должен быть указателем на хендл?


Sirus   (2003-04-09 19:54:00) [4]

Нашел ошибку... Переменные описывались не так...
Теперь работает...

implementation
uses WinSpool;
{$R *.dfm}
var PInfo: TPrinterInfo2;
PBuf, BNeed, PCount:DWord;
PHandle:THandle;
Flags:Dword;


procedure TForm1.Button1Click(Sender: TObject);
begin
Flags:=PRINTER_ENUM_CONNECTIONS;
If EnumPrinters(Flags, nil, 2, @PInfo, 0, BNeed, PCount) then begin
end;
PBuf:=Bneed;
If EnumPrinters(Flags, nil, 2, @PInfo, PBuf, BNeed, PCount) then begin
Label2.Caption:=PInfo.pPrinterName;
if OpenPrinter(PInfo.pPrinterName, PHandle, nil) then begin
Label1.Caption:=IntToStr(PInfo.cJobs);
ClosePrinter(PHandle);
end;
end;
end;

Правда при закрытии вываливается ошибка Access violation


Cobalt   (2003-04-09 19:06:00) [5]

Могу предположить только одно - по счастливой (:-)) случайности, в PHandle попадает хэндл процесса (или потока?)
Попробуй закомментировать строку закрытия принтера - если перестанет закрываться, то ищи, как у тебя портиться PHandle.


Sirus   (2003-04-09 14:03:00) [6]

Вот код который работает но пытается закрыть приложение с ошибкой (только во время компиляции). При запуске откомпилированного проекта ошибка не вылазит, но попросту закрывается приложение... Подскажите в чем ошибка...

implementation
uses WinSpool;
{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
var PInfo: TPrinterInfo2;
PBuf, BNeed, PCount:DWord;
PHandle:THandle;
Flags:Dword;
begin
Flags:=PRINTER_ENUM_CONNECTIONS;
If EnumPrinters(Flags, nil, 2, @PInfo, 0, BNeed, PCount) then begin
end;
PBuf:=Bneed;
If EnumPrinters(Flags, nil, 2, @PInfo, PBuf, BNeed, PCount) then begin
Label2.Caption:=PInfo.pPrinterName;
if OpenPrinter(PInfo.pPrinterName, PHandle, nil) then begin
Label1.Caption:=IntToStr(PInfo.cJobs);
ClosePrinter(PHandle);
end;
end;
end;


Cobalt   (2003-04-09 09:59:00) [7]

Ошибка в 17-ой строке.


Sirus   (2003-04-09 06:18:00) [8]

Спасибо... разобрался....
А почему после определения принтера и передачи его параметров и задач, программа пытается закрытся???


Севостьянов Игорь   (2003-04-08 15:59:00) [9]

ShowMessage(IntToStr(PCount));Сообщают цифру 0 -- это номер принтера в списке

BOOL EnumPrinters(

DWORD Flags, // types of printer objects to enumerate
LPTSTR Name, // name of printer object
DWORD Level, // specifies type of printer info structure
LPBYTE pPrinterEnum, // pointer to buffer to receive printer info structures
DWORD cbBuf, // size, in bytes, of array
LPDWORD pcbNeeded, // pointer to variable with no. of bytes copied (or required)
LPDWORD pcReturned // pointer to variable with no. of printer info. structures copied

);
загляни в printer.pas там много вкусного для тебя звездочка

function TPrinter.GetPrinters: TStrings;
var
LineCur, Port: PChar;
Buffer, PrinterInfo: PChar;
Flags, Count, NumInfo: DWORD;
I: Integer;
Level: Byte;
begin
if FPrinters = nil then
begin
FPrinters := TStringList.Create;
Result := FPrinters;
try
if Win32Platform = VER_PLATFORM_WIN32_NT then
begin
Flags := PRINTER_ENUM_CONNECTIONS or PRINTER_ENUM_LOCAL;
Level := 4;
end
else
begin
Flags := PRINTER_ENUM_LOCAL;
Level := 5;
end;
Count := 0;
EnumPrinters(Flags, nil, Level, nil, 0, Count, NumInfo);
if Count = 0 then Exit;
GetMem(Buffer, Count);
try
if not EnumPrinters(Flags, nil, Level, PByte(Buffer), Count, Count, NumInfo) then
Exit;
PrinterInfo := Buffer;
for I := 0 to NumInfo - 1 do
begin
if Level = 4 then
with PPrinterInfo4(PrinterInfo)^ do
begin
FPrinters.AddObject(pPrinterName,
TPrinterDevice.Create(nil, pPrinterName, nil));
Inc(PrinterInfo, sizeof(TPrinterInfo4));
end
else
with PPrinterInfo5(PrinterInfo)^ do
begin
LineCur := pPortName;
Port := FetchStr(LineCur);
while Port^ <> #0 do
begin
FPrinters.AddObject(Format(SDeviceOnPort, [pPrinterName, Port]),
TPrinterDevice.Create(nil, pPrinterName, Port));
Port := FetchStr(LineCur);
end;
Inc(PrinterInfo, sizeof(TPrinterInfo5));
end;
end;
finally
FreeMem(Buffer, Count);
end;
except
FPrinters.Free;
FPrinters := nil;
raise;
end;
end;
Result := FPrinters;
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо