다음을 통해 공유


큐별 파일 다운로드

사용자가 클라이언트 시스템에서 인쇄 서버로 프린터 연결을 만들기로 결정하고 설치 애플리케이션이 프린터 설치 중 지원 지점 및 인쇄에 설명된 레지스트리 항목을 만든 경우 다음 이벤트가 발생합니다.

  1. 사용자 애플리케이션은 AddPrinterConnection을 호출합니다.

  2. 클라이언트의 원격 인쇄 공급자(Win32spl.dll)는 서버에 대한 연결을 만듭니다.

  3. 서버의 스풀러는 클라이언트에 드라이버 파일을 보냅니다.

  4. 클라이언트의 Win32spl.dll 서버에서 EnumPrinterKey 및 EnumPrinterDataEx를 호출하여 프린터의 레지스트리 항목을 복사합니다.

  5. 서버의 스풀러가 EnumPrinterDataEx를 처리하는 동안 레지스트리 값을 열거할 때 CopyFiles\ICM과 같은 프린터의 CopyFiles 키 하위 키가 발생할 때마다 다음 작업을 수행합니다.

    • 지정한 경우 Point 및 Print DLL을 로드하고 Source 및/또는 대상 경로를 수정할 수 있는 GenerateCopyFilePaths 함수를 호출합니다.

    • GenerateCopyFilePaths에서 반환된 원본 및 대상 경로를 기반으로 SourceDirTargetDir 키를 만들고 EnumPrinterDataEx 데이터로 클라이언트 스풀러에 반환합니다. (이러한 키는 서버에 실제로 존재하지 않습니다.)

  6. 클라이언트의 Win32spl.dll EnumPrinterData 및 EnumPrinterDataEx 호출에 대한 응답으로 받은 프린터 키를 캐시합니다.

  7. CopyFiles\ICM과 같은 프린터 CopyFiles 키의 각 하위 키에 대해 클라이언트의 Win32spl.dll 다음 작업을 수행합니다.

    • 로컬 Point 및 Print DLL(제공된 경우)을 로드하고 Source 및/또는 대상 경로를 수정할 수 있는 GenerateCopyFilePaths 함수를 호출합니다. (입력은 서버에서 받은 SourceDirTargetDir 키입니다.)

    • 서버에서 파일 키와 연결된 모든 파일을 다운로드합니다.

    • Point 및 Print 파일이 다운로드되었음을 나타내는 이벤트를 기록합니다.

    • DLL이 제공된 경우 Point 및 Print DLL의 SpoolerCopyFileEvent 함수를 호출하고 COPYFILE_EVENT_FILES_CHANGED 이벤트를 지정합니다.

  8. 클라이언트 스풀러는 드라이버의 DrvPrinterEvent 함수를 호출하여 PRINTER_EVENT_CACHE_REFRESH 이벤트를 지정합니다.

  9. 클라이언트 스풀러는 드라이버의 DrvPrinterEvent 함수를 다시 호출하여 PRINTER_EVENT_ADD_CONNECTION 이벤트를 지정합니다.

  10. Point 및 Print DLL이 제공되면 클라이언트 스풀러는 SpoolerCopyFileEvent 함수를 호출하여 COPYFILE_EVENT_ADD_PRINTER_CONNECTION 이벤트를 지정합니다.

연결 예제

예를 들어 설치 애플리케이션이 설치 예제에 설명된 서버 레지스트리 항목을 정의한다고 가정합니다. 또한 서버 이름이 NTPRINT이고 클라이언트 이름이 MyClient라고 가정합니다.

NTPRINT의 HpColor라는 인쇄 큐에 연결하기 위해 MyClient의 사용자 애플리케이션은 다음과 같이 AddPrinterConnection을 호출합니다.

AddPrinterConnection("\\NTPRINT\HpColor")

서버에서 스풀러는 Mscms.dll 로드하고 다음과 같이 GenerateCopyFilePaths를 호출합니다.

GenerateCopyFilePaths(
    "HpColor",
    "Color",
    &SplclientInfo1,
    1,
    \\NTPRINT\PRINT$\Color,
    &dwSourceDirSize,
    "Color",
    &dwDestDirSize,
    COPYFILE_FLAG_SERVER_SPOOLER)

Microsoft ICM의 Mscms.dll 모듈은 원본 또는 대상 경로를 수정하지 않으므로 ERROR_SUCCESS 반환합니다.

서버 스풀러는 MyClient에 다음 키를 반환합니다.

SourceDir: \\NTPRINT\PRINT$\Color
TargetDir: "Color"

클라이언트에서 TargetDir 값이 C:\Winnt\System32\Spool\Drivers\Color로 확장됩니다.

MyClient의 스풀러는 다음 작업을 수행합니다.

  • Mscms.dll 다운로드하고 다음과 같이 GenerateCopyFilePaths를 호출합니다.

    GenerateCopyFilePaths(
        "\\NTPRINT\HpColor",
        "Color",
        &SplclientInfo1,
        1,
        \\NTPRINT\PRINT$\Color,
        &dwSourceDirSize,
        "C:\Winnt\System32\Spool\Drivers\Color",
        &dwDestDirSize,
        COPYFILE_FLAG_CLIENT_SPOOLER)
    

    Microsoft ICM의 Mscms.dll 모듈은 원본 또는 대상 경로를 수정하지 않으므로 ERROR_SUCCESS 반환합니다.

  • Hpclrlsr.icm을 C:\Winnt\System32\Spool\Drivers\Color로 다운로드합니다.

  • Point 및 Print 파일이 다운로드되었음을 나타내는 이벤트를 기록합니다.

  • Mscms.dll SpoolerCopyFileEvent 함수를 호출하여 COPYFILE_EVENT_FILES_CHANGED 이벤트를 지정합니다.

  • 프린터 드라이버의 DrvPrinterEvent 함수를 호출하여 PRINTER_EVENT_CACHE_REFRESH 이벤트를 지정합니다.

  • 프린터 드라이버의 DrvPrinterEvent 함수를 다시 호출하여 PRINTER_EVENT_ADD_CONNECTION 이벤트를 지정합니다.

  • Mscms.dll SpoolerCopyFileEvent 함수를 호출하여 COPYFILE_EVENT_ADD_PRINTER_CONNECTION 이벤트를 지정합니다.