Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2003.07.10;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.013 c
3-31087
ss300
2003-06-16 08:31
2003.07.10
помогите с sql запросом


3-31098
xxxCrazyManxxx
2003-06-17 12:02
2003.07.10
Обращение к хранимой процедуре


14-31502
Кен
2003-06-21 06:21
2003.07.10
В чём лучше хранить условия ? У объекта в 2D мире есть свойства


14-31462
ewgeny
2003-06-24 10:01
2003.07.10
Дизайнер форм


14-31454
copyr25
2003-06-22 21:24
2003.07.10
Хакеры уже вербуют даже девушек.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский