Принтер не печатает штрих-код
Здравствуйте. Помогите пожалуйста разобраться почему принтер не хочет печатать штрих код из моей программы. Для генерации штрих кода я использую библиотеку скачанную отсюда http://www.codeproject.com/Articles/13608/A-C-Barcode-Library
Сразу скажу, что принтер рабочий, пробовал печатать на нем текст и картинку из файла, с помощью другой программы.
Вот исходный код, в котором вызывается генерация штрих кода и печать. // Barcode2Image.cpp: определяет точку входа для консольного приложения. //
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <Windows.h>
#include <Winspool.h>
#include <CommDlg.h>
#include <math.h>
#include <atlstr.h>
#include <locale.h>
#include <cstdio>
#include "Barcode.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
TCHAR szDriver[16] = _T("WINSPOOL");
HDC hdcPrint = NULL;
BOOL bReturn = FALSE;
TCHAR szPrinter[256];
DWORD cchBuffer = 255;
HANDLE hPrinter = NULL;
BYTE pdBuffer[16384];
DWORD cbBuf = sizeof (pdBuffer);
DWORD cbNeeded = 0;
PRINTER_INFO_2 *pPrinterData;
pPrinterData = (PRINTER_INFO_2 *)&pdBuffer[0];
bReturn = GetDefaultPrinter(szPrinter, &cchBuffer);
if (bReturn)
bReturn = OpenPrinter(szPrinter, &hPrinter,NULL);
if (bReturn) {
bReturn = GetPrinter(hPrinter, 2, &pdBuffer[0], cbBuf, &cbNeeded);
ClosePrinter(hPrinter);
}
if (bReturn)
hdcPrint = CreateDC(szDriver, szPrinter, pPrinterData->pPortName, NULL);
if(hdcPrint) {
COLORREF color = RGB(0,0,0);
COLORREF colorSpace = RGB(255,255,255);
const char* code = "12345";
Barcode128* BarcodeGen = new Barcode128();
BarcodeGen->Encode128A(code);
BarcodeGen->Draw128(hdcPrint, 10, 10, 100, color, colorSpace, 2);
cout << "Printed" << endl;
} else {
cout << "HDCPrint error" << endl;
}
system("pause");
return 0;
}
И вот сама скачанная библиотека - заголовочный файл в котором я удалил лишние классы, например удалил Code39 и т.д., Оставил только базовый класс, и класс для Code128, потому что мне нужна генерация именно этого штрих кода.
#ifndef Barcode_h_djdfkjdjkfgjgjghdhdhdgdgfgfgfgeue
#define Barcode_h_djdfkjdjkfgjgjghdhdhdgdgfgfgfgeue
class Barcode39;
class Barcode93;
class BarcodeIof5;
class Barcode128;
const int ga2_Code128[2][207]=
{
{
64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106,
},
{
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106,
},
};
class BarcodeBase
{
public:
BarcodeBase()
{
Clear();
i_Ratio=3;
}
void operator=(const BarcodeBase&bc)
{
i_LenBuf=bc.i_LenBuf;
i_Ratio =bc.i_Ratio;
memcpy(ia_Buf,bc.ia_Buf,sizeof(ia_Buf));
}
void Clear()
{
memset(ia_Buf,0,sizeof(ia_Buf));
i_LenBuf=0;
}
int GetEncodeLength() const
{
BYTE*pb=(BYTE*)ia_Buf;
int i,iLen=0;
for(i=0;i<i_LenBuf;i++)
{
//wide is 3
if(*pb&2) iLen+=(i_Ratio-1);
pb++;
}
return iLen+i_LenBuf;
}
int GetBufferLength() const
{
return i_LenBuf;
}
const BYTE&GetAt(int i) const
{
return ia_Buf[i];
}
int GetRatio() const
{
return i_Ratio;
}
int SetRatio(int iRatio)
{
i_Ratio=iRatio;
if(i_Ratio<=0) i_Ratio=1;
}
void DrawBarcode(HDC hDC,int iX,int iY0,int iY10,int iY11,const COLORREF clrBar,const COLORREF clrSpace,const int iPenW)
{
HPEN hPenBar =::CreatePen(PS_SOLID,iPenW,clrBar);
HPEN hPenSpace =::CreatePen(PS_SOLID,iPenW,clrSpace);
HPEN hPenOld=(HPEN)::SelectObject(hDC,hPenBar);
BYTE*pb=ia_Buf;
int i0,iNum0=i_LenBuf;
BYTE bBar;
int i1,iNum1;
int iY;
for(i0=0;i0<iNum0;i0++)
{
bBar =*pb&0x01;
iNum1 =(*pb&0x02)?i_Ratio:1;
iY =(*pb&0x04)?iY11:iY10;
for(i1=0;i1<iNum1;i1++)
{
if(bBar) ::SelectObject(hDC,hPenBar);
else ::SelectObject(hDC,hPenSpace);
::MoveToEx(hDC,iX,iY0,0);
::LineTo(hDC,iX,iY);
iX+=iPenW;
}
pb++;
}
::SelectObject(hDC,hPenOld);
::DeleteObject(hPenBar);
::DeleteObject(hPenSpace);
}
public:
BYTE ia_Buf[4096];
protected:
int i_LenBuf;
int i_Ratio;
struct IntString
{
int ch;
char*psz;
};
};
class Barcode128:public BarcodeBase
{
public:
Barcode128()
{
}
~Barcode128()
{
}
BOOL Encode128A(const char* pszCode) {return P_Encode128((char*)pszCode,SUB::SETA);}
BOOL Encode128B(const char* pszCode) {return P_Encode128((char*)pszCode,SUB::SETB);}
BOOL Encode128C(const char* pszCode) {return P_Encode128((char*)pszCode,SUB::SETC);}
void Draw128(HDC hDC,int iX,int iY0,int iY1,const COLORREF clrBar,const COLORREF clrSpace,const int iPenW)
{
DrawBarcode(hDC,iX,iY0,iY1,iY1,clrBar,clrSpace,iPenW);
}
private:
struct SUB
{
enum
{
SETA=0,
SETB=1,
SETC=2,
};
};
BOOL P_Encode128(char*pszCode,const int iSetIn)
{
Clear();
BYTE*pFst=ia_Buf;
BYTE*pb=pFst;
if(iSetIn==SUB::SETA) pb=P_GetBarSpace128(pb,103);
else
if(iSetIn==SUB::SETB) pb=P_GetBarSpace128(pb,104);
else pb=P_GetBarSpace128(pb,105);
if(pb==0) return 0;
const int iCheckDigit=GetCheckDigit(iSetIn,pszCode);
const int iNum=strlen(pszCode);
int iChar,iCharNext;
int iPosition=0;
int iSet=iSetIn;
while(iPosition<iNum)
{
if(iSet==SUB::SETC)
{
if(ga2_Code128[SUB::SETA][pszCode[iPosition]]==101)
{
pb=P_GetBarSpace128(pb,101);
iPosition++;
iSet=SUB::SETA;
}
else
if(ga2_Code128[SUB::SETA][pszCode[iPosition]]==100)
{
pb=P_GetBarSpace128(pb,100);
iPosition++;
iSet=SUB::SETB;
}
else if(ga2_Code128[SUB::SETA][pszCode[iPosition]]==102)
{
pb=P_GetBarSpace128(pb,100);
iPosition++;
}
else
{
char chT=pszCode[iPosition+2];
pszCode[iPosition+2]=0;
iChar=atoi(&pszCode[iPosition]);
pszCode[iPosition+2]=chT;
pb=P_GetBarSpace128(pb,iChar);
if(pb==0) return 0;
iPosition +=2;
}
}
else
{
int iTemp2=pszCode[iPosition];
if(iTemp2<-1) iTemp2=iTemp2&255;
iChar=ga2_Code128[iSet][iTemp2];
pb=P_GetBarSpace128(pb,iChar);
if(pb==0) return 0;
iPosition++;
if(iSet==SUB::SETA)
{
if(iChar==100) iSet=SUB::SETB;
else
if(iChar==99) iSet=SUB::SETC;
}
else if(iSet==SUB::SETB)
{
if(iChar==101) iSet=SUB::SETA;
else
if(iChar==99) iSet=SUB::SETC;
}
else
if(iChar==98)
{
if(iSet==SUB::SETA)
iCharNext=ga2_Code128[SUB::SETB][pszCode[iPosition]];
else
iCharNext=ga2_Code128[SUB::SETA][pszCode[iPosition]];
pb=P_GetBarSpace128(pb,iChar);
if(pb==0) return 0;
iPosition++;
}
}
}
pb=P_GetBarSpace128(pb,iCheckDigit);
if(pb==0) return 0;
pb=P_GetBarSpace128(pb,106);
i_LenBuf=pb-pFst;
return 1;
}
BYTE*P_GetBarSpace128(BYTE*pb,int iV)
{
if(iV<0) return 0;
if(iV>106) return 0;
IntString infs[]=
{
{0, "bbsbbssbbss"},
{1, "bbssbbsbbss"},
{2, "bbssbbssbbs"},
{3, "bssbssbbsss"},
{4, "bssbsssbbss"},
{5, "bsssbssbbss"},
{6, "bssbbssbsss"},
{7, "bssbbsssbss"},
{8, "bsssbbssbss"},
{9, "bbssbssbsss"},
{10, "bbssbsssbss"},
{11, "bbsssbssbss"},
{12, "bsbbssbbbss"},
{13, "bssbbsbbbss"},
{14, "bssbbssbbbs"},
{15, "bsbbbssbbss"},
{16, "bssbbbsbbss"},
{17, "bssbbbssbbs"},
{18, "bbssbbbssbs"},
{19, "bbssbsbbbss"},
{20, "bbssbssbbbs"},
{21, "bbsbbbssbss"},
{22, "bbssbbbsbss"},
{23, "bbbsbbsbbbs"},
{24, "bbbsbssbbss"},
{25, "bbbssbsbbss"},
{26, "bbbssbssbbs"},
{27, "bbbsbbssbss"},
{28, "bbbssbbsbss"},
{29, "bbbssbbssbs"},
{30, "bbsbbsbbsss"},
{31, "bbsbbsssbbs"},
{32, "bbsssbbsbbs"},
{33, "bsbsssbbsss"},
{34, "bsssbsbbsss"},
{35, "bsssbsssbbs"},
{36, "bsbbsssbsss"},
{37, "bsssbbsbsss"},
{38, "bsssbbsssbs"},
{39, "bbsbsssbsss"},
{40, "bbsssbsbsss"},
{41, "bbsssbsssbs"},
{42, "bsbbsbbbsss"},
{43, "bsbbsssbbbs"},
{44, "bsssbbsbbbs"},
{45, "bsbbbsbbsss"},
{46, "bsbbbsssbbs"},
{47, "bsssbbbsbbs"},
{48, "bbbsbbbsbbs"},
{49, "bbsbsssbbbs"},
{50, "bbsssbsbbbs"},
{51, "bbsbbbsbsss"},
{52, "bbsbbbsssbs"},
{53, "bbsbbbsbbbs"},
{54, "bbbsbsbbsss"},
{55, "bbbsbsssbbs"},
{56, "bbbsssbsbbs"},
{57, "bbbsbbsbsss"},
{58, "bbbsbbsssbs"},
{59, "bbbsssbbsbs"},
{60, "bbbsbbbbsbs"},
{61, "bbssbssssbs"},
{62, "bbbbsssbsbs"},
{63, "bsbssbbssss"},
{64, "bsbssssbbss"},
{65, "bssbsbbssss"},
{66, "bssbssssbbs"},
{67, "bssssbsbbss"},
{68, "bssssbssbbs"},
{69, "bsbbssbssss"},
{70, "bsbbssssbss"},
{71, "bssbbsbssss"},
{72, "bssbbssssbs"},
{73, "bssssbbsbss"},
{74, "bssssbbssbs"},
{75, "bbssssbssbs"},
{76, "bbssbsbssss"},
{77, "bbbbsbbbsbs"},
{78, "bbssssbsbss"},
{79, "bsssbbbbsbs"},
{80, "bsbssbbbbss"},
{81, "bssbsbbbbss"},
{82, "bssbssbbbbs"},
{83, "bsbbbbssbss"},
{84, "bssbbbbsbss"},
{85, "bssbbbbssbs"},
{86, "bbbbsbssbss"},
{87, "bbbbssbsbss"},
{88, "bbbbssbssbs"},
{89, "bbsbbsbbbbs"},
{90, "bbsbbbbsbbs"},
{91, "bbbbsbbsbbs"},
{92, "bsbsbbbbsss"},
{93, "bsbsssbbbbs"},
{94, "bsssbsbbbbs"},
{95, "bsbbbbsbsss"},
{96, "bsbbbbsssbs"},
{97, "bbbbsbsbsss"},
{98, "bbbbsbsssbs"},
{99, "bsbbbsbbbbs"},
{100, "bsbbbbsbbbs"},
{101, "bbbsbsbbbbs"},
{102, "bbbbsbsbbbs"},
// {103, "bbsbsbbbbss"},
{103, "bbsbssssbss"},
{104, "bbsbssbssss"},
{105, "bbsbssbbbss"},
{106, "bbsssbbbsbsbb"},
};
int i;
IntString&inf=infs[iV];
for(i=0;i<11;i++)
{
if(inf.psz[i]=='b') *pb+=1;
pb++;
}
if(iV==106)
{
*pb+=1; pb++;
*pb+=1; pb++;
}
return pb;
}
private:
int GetCheckDigit(const int iSet,char*pszCode)
{
int iSum=0,iCurSet=0,iChar128,iCharNext,iWeight,iPosition;
iCurSet=iSet;
if(iSet==SUB::SETA)
{
iSum=103;
}
else
if(iSet==SUB::SETB)
{
iSum=104;
}
else
if(iSet==SUB::SETC)
{
iSum=105;
}
iPosition=0;
iWeight=1;
const int iNum=strlen(pszCode);
while(iPosition<iNum)
{
if(iCurSet==SUB::SETC)
{
if(ga2_Code128[SUB::SETA][pszCode[iPosition]]==101)
{
iChar128=101;
iSum+=(iWeight*iChar128);
iPosition++;
iWeight++;
iCurSet=SUB::SETA;
}
else if(ga2_Code128[SUB::SETA][pszCode[iPosition]]==100)
{
iChar128=100;
iSum+=(iWeight*iChar128);
iPosition++;
iWeight++;
iCurSet=SUB::SETB;
}
else
if(ga2_Code128[SUB::SETA][pszCode[iPosition]]==102)
{
iChar128=102;
iSum+=(iWeight*iChar128);
iPosition++;
iWeight++;
}
else
{
char chT=pszCode[iPosition+2];
pszCode[iPosition+2]=0;
iChar128=atol(&pszCode[iPosition]);
pszCode[iPosition+2]=chT;
iSum +=(iWeight*iChar128);
iPosition +=2;
iWeight++;
}
}
else
{
int iTemp2=pszCode[iPosition];
if(iTemp2<-1) iTemp2=iTemp2&255;
iChar128=ga2_Code128[iCurSet][iTemp2];
iSum+=(iWeight*iChar128);
iPosition++;
iWeight++;
if(iCurSet==SUB::SETA)
{
if(iChar128==100)
iCurSet=SUB::SETB;
else if(iChar128==99)
iCurSet=SUB::SETC;
}
else
if(iCurSet==SUB::SETB)
{
if(iChar128==101) iCurSet=SUB::SETA;
else if(iChar128==99) iCurSet=SUB::SETC;
}
else
if(iChar128==98)
{
if(iCurSet==SUB::SETA)
iCharNext=ga2_Code128[SUB::SETB][pszCode[iPosition]];
else
iCharNext=ga2_Code128[SUB::SETA][pszCode[iPosition]];
iSum+=(iWeight*iCharNext);
iPosition++;
iWeight++;
}
}
}
return iSum%103;
}
};
#endif
Программа запускается и завершается нормально, в конце написано Printed, то есть принтер был найден и ему были отосланы данные для печати, вроде)) Хотя при запуске в задачах принтера не появлялось ни одной задачи. Заранее спасибо)