2013-05-04 5 views
1

안녕하세요 winspool을 사용하여 프린터 상태에 액세스하는 방법에 대한 예제를 사용했습니다.Winspool을 사용하여 프린터 상태에 액세스

//Code written by Mark Middlemist - @delradie 
//Made available at http://delradiesdev.blogspot.com 
//Interop details from http://pinvoke.net/ 
using System; 
using System.Runtime.InteropServices; 

namespace DelradiesDev.PrinterStatus 
{ 
    public class WinSpoolPrinterInfo 
    { 
    [DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)] 
    public static extern int OpenPrinter(string pPrinterName, out IntPtr phPrinter, ref PRINTER_DEFAULTS pDefault); 

    [DllImport("winspool.drv", SetLastError = true, CharSet = CharSet.Auto)] 
    public static extern bool GetPrinter(IntPtr hPrinter, Int32 dwLevel, IntPtr pPrinter, Int32 dwBuf, out Int32 dwNeeded); 

    [DllImport("winspool.drv", SetLastError = true)] 
    public static extern int ClosePrinter(IntPtr hPrinter); 

    [StructLayout(LayoutKind.Sequential)] 
    public struct PRINTER_DEFAULTS 
    { 
     public IntPtr pDatatype; 
     public IntPtr pDevMode; 
     public int DesiredAccess; 
    } 

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] 
    public struct PRINTER_INFO_2 
    { 
     [MarshalAs(UnmanagedType.LPTStr)] 
     public string pServerName;  

     [MarshalAs(UnmanagedType.LPTStr)] 
     public string pPrinterName; 

     [MarshalAs(UnmanagedType.LPTStr)] 
     public string pShareName; 

     [MarshalAs(UnmanagedType.LPTStr)] 
     public string pPortName; 

     [MarshalAs(UnmanagedType.LPTStr)] 
     public string pDriverName; 

     [MarshalAs(UnmanagedType.LPTStr)] 
     public string pComment; 

     [MarshalAs(UnmanagedType.LPTStr)] 
     public string pLocation; 

     public IntPtr pDevMode; 

     [MarshalAs(UnmanagedType.LPTStr)]  
     public string pSepFile; 

     [MarshalAs(UnmanagedType.LPTStr)]  
     public string pPrintProcessor; 

     [MarshalAs(UnmanagedType.LPTStr)] 
     public string pDatatype; 

     [MarshalAs(UnmanagedType.LPTStr)] 
     public string pParameters; 

     public IntPtr pSecurityDescriptor; 
     public uint Attributes; 
     public uint Priority; 
     public uint DefaultPriority; 
     public uint StartTime; 
     public uint UntilTime; 
     public uint Status; 
     public uint cJobs; 
     public uint AveragePPM; 
    } 

    public PRINTER_INFO_2? GetPrinterInfo(String printerName) 
    { 
     IntPtr pHandle;  
     PRINTER_DEFAULTS defaults = new PRINTER_DEFAULTS();  
     PRINTER_INFO_2? Info2 = null; 

     OpenPrinter(printerName, out pHandle, ref defaults); 

     Int32 cbNeeded = 0; 

     bool bRet = GetPrinter(pHandle, 2, IntPtr.Zero, 0, out cbNeeded); 

     if (cbNeeded > 0) 
     { 
     IntPtr pAddr = Marshal.AllocHGlobal((int)cbNeeded); 

     bRet = GetPrinter(pHandle, 2, pAddr, cbNeeded, out cbNeeded); 

     if (bRet)   
     { 
      Info2 = (PRINTER_INFO_2)Marshal.PtrToStructure(pAddr, typeof(PRINTER_INFO_2)); 
     } 

     Marshal.FreeHGlobal(pAddr); 
     } 

     ClosePrinter(pHandle); 

     return Info2; 
    } 
    } 
} 

그러나 함수를 호출하면 printername을 제외하고 어떤 데이터가 전달 될지 알 수 없습니다. 누군가 나를 도울 수 있습니까?

OpenPrinter(string pPrinterName, out IntPtr phPrinter, ref PRINTER_DEFAULTS pDefault) 

GetPrinter(IntPtr hPrinter, Int32 dwLevel, IntPtr pPrinter, Int32 dwBuf, out Int32 dwNeeded) 

ClosePrinter(IntPtr hPrinter) 

해당 기능에 대한 데이터는 무엇입니까?

답변

-1

귀하의 질문에 대한 이해가 확실하지 않습니다. GetPrinterInfo-method를 호출하면 Winspool.drv의 함수가 사용되어 관리되는 PRINTER_INFO_2 구조체가 생성됩니다.

+1

질문을 이해할 수 없으면 먼저 질문에 대한 답을 명확하게하십시오. – lisp