2010-04-08 2 views
2

내가 컴퓨터에 설치된 로컬 프린터 목록에이 루틴을 사용하고 있습니다 :목록 로컬 프린터

var 
    p: pointer; 
    hpi: _PRINTER_INFO_2A; 
    hGlobal: cardinal; 
    dwNeeded, dwReturned: DWORD; 
    bFlag: boolean; 
    i: dword; 
begin 
    p := nil; 
    EnumPrinters(PRINTER_ENUM_LOCAL, nil, 2, p, 0, dwNeeded, dwReturned); 
    if (dwNeeded = 0) then exit; 
    GetMem(p,dwNeeded); 
    if (p = nil) then exit; 
    bFlag := EnumPrinters(PRINTER_ENUM_LOCAL, nil, 2, p, dwneeded, dwNeeded, dwReturned); 
    if (not bFlag) then exit; 
    CbLblPrinterPath.Properties.Items.Clear; 
    for i := 0 to dwReturned - 1 do 
    begin 
    CbLblPrinterPath.Properties.Items.Add(TPrinterInfos(p^)[i].pPrinterName); 
    end; 
    FreeMem(p); 

TPrinterInfos(p^)[i].pPrinterName 프린터 이름에 대한 'P'를 반환합니다. 프린터로 설치된 PdfCreator 있습니다.

TPrinterInfos_PRINTER_INFO_2A의 배열입니다.

어떻게 해결할 수 있습니까? 유니 코드 델파이 버전을 사용하고 있기 때문에

답변

3

좋아, 우선 ... 먼저이 태그가 Delphi-2010이므로 D2010에이 문제가 있다고 가정합니다.

문제는 _PRINTER_INFO_2A를 사용하여 시작합니다.이 구조는 Ansi 버전의 EnumPrinters 함수에 사용되는 구조입니다. 유니 코드가 도입 된 이래로 "EnumPrinters"함수는 유니 코드 버전의 함수에 매핑되므로 _PRINTER_INFO_2W를 사용해야합니다. (또는 명시 적으로 EnumPrintersA를 호출하십시오.) EnumPrinters (A/W없이)를 사용하는 경우 _PRINTER_INFO_2 (A/W없이)를 사용해야합니다. 그렇게하면 언젠가 UTF32 버전이 새로운 표준이되는 경우 문제가 발생할 가능성이 줄어 듭니다.

+0

켄, 고맙습니다. – vladimir

2

당신은 당신이 단순히 프린터 변수에 제공된 목록을 사용하여 로컬 프린터의 목록을 얻을 수 있습니다 대신 _PRINTER_INFO_2A

2

의 _PRINTER_INFO_2W 구조를 사용한다. 단순한 이름으로

uses Printers; 
... 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Memo1.Lines.Assign(Printer.Printers); 
end; 

당신이하는 일에 대한 특별한 이유가없는 한이 방법을 사용합니다.

+1

Printer.Printers는 로컬 프린터 만 제공하지 않습니다. –

+0

목록이 업데이트되지 않습니다 (한 번만 읽음) – Remko

+0

@Remko One은 다음 문을 실행하여 프린터 목록을 새로 고칩니다. Printer.Refresh; – 10100111001