Re: Печать файлов произвольного типа
От: DreadDog Россия  
Дата: 18.12.02 13:57
Оценка:
Здравствуйте, dimok@, Вы писали:

D>Или еще глубже — графическое изображение произвольного файла! Есть ли пути короче?

У нас стояла аналогичная задача, но там формулировалось как печать на виртуальный принтер UDC (Universal Data Converter) файлов с определенными расширениями и складывание их в тот же каталог в свои подпапки. Печатали через ShellExecute(..,"print",..). Если отправить не удалось — переходим к следующему файлу, иначе — ждем пока у этого принтера есть работа — использовалась функция из MSDN:

   BOOL GetJobs(HANDLE hPrinter,        /* Handle to the printer. */ 
                JOB_INFO_2 **ppJobInfo, /* Pointer to be filled.  */ 
                int *pcJobs,            /* Count of jobs filled.  */ 
                DWORD *pStatus)         /* Print Queue status.    */ 

   {
      DWORD               cByteNeeded,
                          nReturned,
                          cByteUsed;
      JOB_INFO_2          *pJobStorage = NULL;
      PRINTER_INFO_2      *pPrinterInfo = NULL;

   /* Get the buffer size needed. */ 
       if (!GetPrinter(hPrinter, 2, NULL, 0, &cByteNeeded))
       {
           if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
               return FALSE;
       }

       pPrinterInfo = (PRINTER_INFO_2 *)malloc(cByteNeeded);
       if (!(pPrinterInfo))
           /* Failure to allocate memory. */ 
           return FALSE;

       /* Get the printer information. */ 
       if (!GetPrinter(hPrinter,
               2,
               (unsigned char *)pPrinterInfo,
               cByteNeeded,
               &cByteUsed))
       {
           /* Failure to access the printer. */ 
           free(pPrinterInfo);
           pPrinterInfo = NULL;
           return FALSE;
       }

       /* Get job storage space. */ 
       if (!EnumJobs(hPrinter,
               0,
               pPrinterInfo->cJobs,
               2,
               NULL,
               0,
               (LPDWORD)&cByteNeeded,
               (LPDWORD)&nReturned))
       {
           if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
           {
               free(pPrinterInfo);
               pPrinterInfo = NULL;
               return FALSE;
           }
       }

       pJobStorage = (JOB_INFO_2 *)malloc(cByteNeeded);
       if (!pJobStorage)
       {
           /* Failure to allocate Job storage space. */ 
           free(pPrinterInfo);
           pPrinterInfo = NULL;
           return FALSE;
       }

       ZeroMemory(pJobStorage, cByteNeeded);

       /* Get the list of jobs. */ 
       if (!EnumJobs(hPrinter,
               0,
               pPrinterInfo->cJobs,
               2,
               (LPBYTE)pJobStorage,
               cByteNeeded,
               (LPDWORD)&cByteUsed,
               (LPDWORD)&nReturned))
       {
           free(pPrinterInfo);
           free(pJobStorage);
           pJobStorage = NULL;
           pPrinterInfo = NULL;
           return FALSE;
       }

       /*
        *  Return the information.
        */ 
       *pcJobs = nReturned;
       *pStatus = pPrinterInfo->Status;
       *ppJobInfo = pJobStorage;
       free(pPrinterInfo);

       return TRUE;

   }


Код использования такой:


// ... Preparing Directories
        DWORD flags;
    if (!hSpy)
    {
        hSpy = FindFirstPrinterChangeNotification( pHandle, PRINTER_CHANGE_ADD_JOB, 0, NULL );
    } else 
        FindNextPrinterChangeNotification( hSpy, &flags, NULL, NULL );    
    if ( hSpy == INVALID_HANDLE_VALUE )
         DWORD error = GetLastError();

    HINSTANCE error = ShellExecute( NULL, "print", _T(fullpath), NULL, NULL, SW_SHOWNOACTIVATE );
    if (((int)error) <= 32)
    { // Error
       printf(" - ERROR\n");
           RemoveDirectory(str);
       return;
    }

    JOB_INFO_2 *    info;
    int        num;
    DWORD        status;

    GetJobs(pHandle, &info, &num, &status);
    WaitForSingleObject( hSpy, INFINITE );
    // Wait For End Job
    while (1)
    {
        GetJobs(pHandle, &info, &num, &status);
        if (num == 0)
            break;
        Sleep(1);
    }
    MoveDirectory(str);
    printf(" - SUCCESS\n");


Может это можно использовать ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.