Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.10;
Скачать: CL | DM;

Вниз

Почему не определяется принтер???   Найти похожие ветки 

 
Sirus ©   (2003-04-08 13:17) [0]

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

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
Где ошибка???


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

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;


 
Sirus ©   (2003-04-09 06:18) [2]

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


 
Cobalt ©   (2003-04-09 09:59) [3]

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


 
Sirus ©   (2003-04-09 14:03) [4]

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

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 19:06) [5]

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


 
Sirus ©   (2003-04-09 19:54) [6]

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

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-10 12:49) [7]

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


 
Sirus ©   (2003-04-11 07:27) [8]

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


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

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;



Страницы: 1 вся ветка

Текущий архив: 2003.07.10;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
6-31384
alt7
2003-05-05 14:38
2003.07.10
TIdTelnet читать из буфера


1-31240
Andrey02
2003-06-28 19:39
2003.07.10
Thread поток - метод Synchronize. Качество программы.


14-31510
shark
2003-06-21 22:49
2003.07.10
Найти радиус


6-31390
ДмитрийК
2003-04-21 08:12
2003.07.10
Проблема с RasHangUp


3-31149
Oleg
2003-06-18 17:39
2003.07.10
Ошибка из-за индекса