Печать на принтер по умолчанию.
От: xjroman  
Дата: 20.03.07 09:27
Оценка:
Перерыл весь форум, но так и не нашел ответа.
Есть текстовый файл в DOS кодировке с символами форматирования.
Надо его напечатать на принтере по умолчанию.
Вначале я читаю текстовый файл в CString, а потом передаю эту строку
в функцию печати. Проблема возникает когда пытаюсь печатать на сетевом принтере. Точнее на одном сетевом принтере печать проходит нормально. А на другом вылазит только первая строка.
Хотя принтер добросовестно обрабатывает символы форматирования, которые находятся где то в середине файла. ( двустороняя печать).

Получаю имя принтера по умолчанию
char *CGrsprintApp::GetDefaultPrinter()
{
    CString printer ( "test" );
    TCHAR szName[0x200];
    ::GetProfileString(_T("Windows"),_T("Device"),_T(",,,"),szName, sizeof szName/sizeof(TCHAR));
    return strtok ( szName , ",");

} /* char *CGrsprintApp::GetDefaultPrinter() */

Чтение файла и печать.
CString CGrsprintApp::LoadFromFile( const char *strFileName )
{
    CString str;
    string buf;
    ifstream File;
    
    File.open( strFileName );
    
    if( !File ) return -1;
    while (File)
    {
        getline ( File, buf );
        str = str + "\n" + buf.c_str();
    }

    return str;

} /* CString CGrsprintApp::LoadFromFile(CString strName) */
 // Содрано с мсдн
BOOL CGrsprintApp::RawDataToPrinter( LPSTR szPrinterName, LPBYTE lpData, DWORD dwCount )
{
    HANDLE     hPrinter;
    DOC_INFO_1 DocInfo;
    DWORD      dwJob;
    DWORD      dwBytesWritten;

    if( ! OpenPrinter( szPrinterName , &hPrinter, NULL ) )
       return FALSE;

    DocInfo.pDocName = "Document";
    DocInfo.pOutputFile = NULL;
    DocInfo.pDatatype = "RAW";

    if( (dwJob = StartDocPrinter( hPrinter, 1, ( unsigned char* )&DocInfo )) == 0 )
        {
          ClosePrinter( hPrinter );
          return FALSE;
        }

        if( ! StartPagePrinter( hPrinter ) )
        {
          EndDocPrinter( hPrinter );
          ClosePrinter( hPrinter );
          return FALSE;
        }
        
        if( !WritePrinter( hPrinter, lpData, dwCount, &dwBytesWritten ) )
        {
          EndPagePrinter( hPrinter );
          EndDocPrinter( hPrinter );
          ClosePrinter( hPrinter );
          return FALSE;
        }
        
        if( ! EndPagePrinter( hPrinter ) )
        {
          EndDocPrinter( hPrinter );
          ClosePrinter( hPrinter );
          return FALSE;
        }
        
        if( ! EndDocPrinter( hPrinter ) )
        {
          ClosePrinter( hPrinter );
          return FALSE;
        }
        
        ClosePrinter( hPrinter );
        
        if( dwBytesWritten != dwCount )
          return FALSE;

        return TRUE;


} /* BOOL CGrsprintApp::RawDataToPrinter( LPSTR szPrinterName, LPBYTE lpData, DWORD dwCount ) */


Вызов
CString strPrinter = GetDefaultPrinter();
CString pBuf = LoadFromFile ( strFile );
int     iLen = pBuf.GetLength();
RawDataToPrinter ( strPrinter.GetBuffer(10), (unsigned char*)pBuf.GetBuffer(10), iLen );

Я так подозреваю, что неправильно формирую lpData который передаю в
RawDataToPrinter. Но как надо я так и не нашел.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.