⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pp.c

📁 printer processor sample code. tried successfully in win2k, winxp,
💻 C
📖 第 1 页 / 共 2 页
字号:
/*++

Copyright (c) 1990-2003 Microsoft Corporation
All Rights Reserved

Windows Server 2003 (Printing) Driver Development Kit Samples

--*/



#include "pp.h"

HMODULE hmod = NULL;
WCHAR *pszRegistryPath = NULL;
WCHAR *pszRegistryPortNames=L"PortNames";
WCHAR szMachineName[MAX_COMPUTERNAME_LENGTH + 3];
CRITICAL_SECTION SplSem;
HMODULE hSpoolssDll = NULL;
FARPROC pfnSpoolssEnumPorts = NULL;

static
PRINTPROVIDOR PrintProvidor =
{
    PP_OpenPrinter,
    PP_SetJob,
    PP_GetJob,
    PP_EnumJobs,
    PP_AddPrinter,
    PP_DeletePrinter,
    PP_SetPrinter,
    PP_GetPrinter,
    PP_EnumPrinters,
    PP_AddPrinterDriver,
    PP_EnumPrinterDrivers,
    PP_GetPrinterDriver,
    PP_GetPrinterDriverDirectory,
    PP_DeletePrinterDriver,
    PP_AddPrintProcessor,
    PP_EnumPrintProcessors,
    PP_GetPrintProcessorDirectory,
    PP_DeletePrintProcessor,
    PP_EnumPrintProcessorDatatypes,
    PP_StartDocPrinter,
    PP_StartPagePrinter,
    PP_WritePrinter,
    PP_EndPagePrinter,
    PP_AbortPrinter,
    PP_ReadPrinter,
    PP_EndDocPrinter,
    PP_AddJob,
    PP_ScheduleJob,
    PP_GetPrinterData,
    PP_SetPrinterData,
    PP_WaitForPrinterChange,
    PP_ClosePrinter,
    PP_AddForm,
    PP_DeleteForm,
    PP_GetForm,
    PP_SetForm,
    PP_EnumForms,
    PP_EnumMonitors,
    PP_EnumPorts,
    PP_AddPort,
    PP_ConfigurePort,
    PP_DeletePort,
    PP_CreatePrinterIC,
    PP_PlayGdiScriptOnPrinterIC,
    PP_DeletePrinterIC,
    PP_AddPrinterConnection,
    PP_DeletePrinterConnection,
    PP_PrinterMessageBox,
    PP_AddMonitor,
    PP_DeleteMonitor
};









BOOL DllMain
(
    HINSTANCE hdll,
    DWORD     dwReason,
    LPVOID    lpReserved
)
{
    UNREFERENCED_PARAMETER(lpReserved);

    if (dwReason == DLL_PROCESS_ATTACH)
    {


        DisableThreadLibraryCalls(hdll);

        hmod = hdll;



    }
    else if (dwReason == DLL_PROCESS_DETACH)
    {


    }
    return TRUE;
}



DWORD
InitializePortNames
(
    VOID
)

{
    DWORD err;
    HKEY  hkeyPath;
    HKEY  hkeyPortNames;

    err = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
                        pszRegistryPath,
                        0,
                        KEY_READ,
                        &hkeyPath );

    if (!err)
    {
        err = RegOpenKeyEx( hkeyPath,
                            pszRegistryPortNames,
                            0,
                            KEY_READ,
                            &hkeyPortNames );

        if (!err)
        {
            DWORD i = 0;
            WCHAR Buffer[MAX_PATH];
            DWORD BufferSize;

            while (!err)
            {
                BufferSize = sizeof Buffer;

                err = RegEnumValue( hkeyPortNames,
                                    i,
                                    Buffer,
                                    &BufferSize,
                                    NULL,
                                    NULL,
                                    NULL,
                                    NULL );

                if (!err)
                {
                    CreatePortEntry(Buffer);
                }

                i++;
            }




            if (ERROR_NO_MORE_ITEMS == err)
            {
                err = NO_ERROR;
            }

            RegCloseKey(hkeyPortNames);
        }

        RegCloseKey(hkeyPath);
    }
    return err;
}








BOOL
InitializePrintProvidor
(
    LPPRINTPROVIDOR pPrintProvidor,
    DWORD           cbPrintProvidor,
    LPWSTR          pszFullRegistryPath
)

{
    DWORD dwLen;

    if (!pPrintProvidor || !pszFullRegistryPath || !*pszFullRegistryPath)
    {
        SetLastError(ERROR_INVALID_PARAMETER);
        return FALSE;
    }

    memcpy(pPrintProvidor, &PrintProvidor, min(sizeof(PRINTPROVIDOR), cbPrintProvidor));




    if (!(pszRegistryPath = AllocSplStr(pszFullRegistryPath)))
    {
        return FALSE;
    }


    //
    // Try and initialize the crit-sect
    //
    __try
    {
        InitializeCriticalSection(&SplSem);
    }
    __except (EXCEPTION_EXECUTE_HANDLER)
    {
        return FALSE;
    }


    szMachineName[0] = szMachineName[1] = L'\\';
    dwLen = MAX_COMPUTERNAME_LENGTH;
    GetComputerName(szMachineName + 2, &dwLen);


    InitializePortNames();

    return TRUE;
}


BOOL
PP_OpenPrinter
(
    LPWSTR             pszPrinterName,
    LPHANDLE           phPrinter,
    LPPRINTER_DEFAULTS pDefault
)

{
    DWORD err = NO_ERROR;

    UNREFERENCED_PARAMETER(pDefault);

    if (!pszPrinterName)
    {
        SetLastError(ERROR_INVALID_NAME);
        return FALSE;
    }





    if (err)
    {
        SetLastError(err);
    }
    return (err == NO_ERROR);
}



BOOL
PP_ClosePrinter
(
    HANDLE  hPrinter
)

{
    DWORD err = NO_ERROR;





    if (err)
    {
        SetLastError(err);
    }
    return (err == NO_ERROR);
}



BOOL
PP_GetPrinter
(
    HANDLE  hPrinter,
    DWORD   dwLevel,
    LPBYTE  pbPrinter,
    DWORD   cbBuf,
    LPDWORD pcbNeeded
)

{
    DWORD err = NO_ERROR;





    if (err)
    {
        SetLastError(err);
    }

    return (err == NO_ERROR);
}



BOOL
PP_SetPrinter
(
    HANDLE  hPrinter,
    DWORD   dwLevel,
    LPBYTE  pbPrinter,
    DWORD   dwCommand
)

{
    DWORD err = NO_ERROR;

    UNREFERENCED_PARAMETER(pbPrinter);

    switch (dwLevel)
    {
        case 0:
        case 1:
        case 2:
        case 3:
            break;

        default:
            SetLastError(ERROR_INVALID_LEVEL);
            return FALSE;
    }





    if (err)
    {
        SetLastError(err);
    }

    return (err == NO_ERROR);
}



BOOL
PP_EnumPrinters
(
    DWORD   dwFlags,
    LPWSTR  pszName,
    DWORD   dwLevel,
    LPBYTE  pbPrinter,
    DWORD   cbBuf,
    LPDWORD pcbNeeded,
    LPDWORD pcReturned
)

{
    DWORD  err = NO_ERROR;

    if ((dwLevel != 1) && (dwLevel != 2))
    {



        SetLastError(ERROR_INVALID_NAME);
        return FALSE;
    }
    else if (!pcbNeeded || !pcReturned)
    {
        SetLastError(ERROR_INVALID_PARAMETER);
        return FALSE;
    }





    if (err)
    {
        SetLastError(err);
    }

    return (err == NO_ERROR);
}



DWORD
PP_StartDocPrinter
(
    HANDLE  hPrinter,
    DWORD   dwLevel,
    LPBYTE  lpbDocInfo
)

{
    DWORD err = NO_ERROR;
    DOC_INFO_1 *pDocInfo1 = (DOC_INFO_1 *)lpbDocInfo;
    LPWSTR pszUser = NULL;
    BOOL fGateway = FALSE;

    if (dwLevel != 1)
    {
        SetLastError(ERROR_INVALID_PARAMETER);
        return FALSE;
    }





    if (err)
    {
        SetLastError(err);
    }

    return (err == NO_ERROR);
}



BOOL
PP_WritePrinter
(
    HANDLE  hPrinter,
    LPVOID  pBuf,
    DWORD   cbBuf,
    LPDWORD pcbWritten
)

{
    DWORD err = NO_ERROR;





    if (err)
    {
        SetLastError(err);
    }

    return (err == NO_ERROR);
}



BOOL
PP_AbortPrinter
(
    HANDLE  hPrinter
)

{
    DWORD err = NO_ERROR;





    if (err)
    {
        SetLastError(err);
    }

    return (err == NO_ERROR);

}



BOOL
PP_EndDocPrinter
(
    HANDLE   hPrinter
)

{
    DWORD err = NO_ERROR;





    if (err)
    {
        SetLastError(err);
    }

    return (err == NO_ERROR);
}



BOOL
PP_GetJob
(
    HANDLE   hPrinter,
    DWORD    dwJobId,
    DWORD    dwLevel,
    LPBYTE   pbJob,
    DWORD    cbBuf,
    LPDWORD  pcbNeeded
)

{
    DWORD err = NO_ERROR;

    if ((dwLevel != 1) && (dwLevel != 2))
    {
        SetLastError(ERROR_INVALID_LEVEL);
        return FALSE;
    }





    if (err)
    {
        SetLastError(err);
    }

    return (err == NO_ERROR);
}



BOOL
PP_EnumJobs
(
    HANDLE  hPrinter,
    DWORD   dwFirstJob,
    DWORD   dwNoJobs,
    DWORD   dwLevel,
    LPBYTE  pbJob,
    DWORD   cbBuf,
    LPDWORD pcbNeeded,
    LPDWORD pcReturned
)

{
    DWORD err = NO_ERROR;

    if ((dwLevel != 1) && (dwLevel != 2))
    {
        SetLastError(ERROR_INVALID_LEVEL);
        return FALSE;
    }





    if (err)
    {
        SetLastError(err);
    }
    return (err == NO_ERROR);
}



BOOL
PP_SetJob
(
    HANDLE  hPrinter,
    DWORD   dwJobId,
    DWORD   dwLevel,
    LPBYTE  pbJob,
    DWORD   dwCommand
)

{
    DWORD err = NO_ERROR;

    if ((dwLevel != 0) && (dwLevel != 1) && (dwLevel != 2))
    {
        SetLastError(ERROR_INVALID_LEVEL);
        return FALSE;
    }
    else if ((dwLevel == 0) && (pbJob != NULL))
    {
        SetLastError(ERROR_INVALID_PARAMETER);
        return FALSE;
    }





    if (err)
    {
        SetLastError(err);
    }
    return (err == NO_ERROR);
}



BOOL
PP_AddJob
(
    HANDLE  hPrinter,
    DWORD   dwLevel,
    LPBYTE  pbAddJob,
    DWORD   cbBuf,
    LPDWORD pcbNeeded
)

{
    DWORD err = NO_ERROR;

    ADDJOB_INFO_1W TempBuffer;
    PADDJOB_INFO_1W OutputBuffer;
    DWORD OutputBufferSize;

    if (dwLevel != 1)
    {
        SetLastError(ERROR_INVALID_PARAMETER);
        return FALSE;
    }








    if (cbBuf < sizeof(ADDJOB_INFO_1W))
    {
        OutputBuffer = &TempBuffer;
        OutputBufferSize = sizeof(ADDJOB_INFO_1W);
    }
    else
    {
        OutputBuffer = (LPADDJOB_INFO_1W) pbAddJob;
        OutputBufferSize = cbBuf;
    }





    if (err)
    {
        SetLastError(err);
    }

    return (err == NO_ERROR);
}



BOOL
PP_ScheduleJob
(
    HANDLE  hPrinter,
    DWORD   dwJobId
)

{
    DWORD err = NO_ERROR;




    if (err)
    {
        SetLastError(err);
    }

    return (err == NO_ERROR);
}



DWORD
PP_WaitForPrinterChange
(
    HANDLE  hPrinter,
    DWORD   dwFlags
)

{
    DWORD err = NO_ERROR;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -