Перерыл весь форум, но так и не нашел ответа.
Есть текстовый файл в 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. Но как надо я так и не нашел.