Текущий архив: 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));
Сообщают цифру 0
ShowMessage(IntToStr(PCount));
Где ошибка???
← →
Севостьянов Игорь (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.47 MB
Время: 0.007 c