Здравствуйте, 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");
Может это можно использовать ?