// PrintData.cpp: implementation of the PrintData class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "JournalPtrTest.h"
#include "JournalPtrTest.h"
#include "PrintData.h"
#include <direct.h>
#include <io.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
// API从1.0到3.0都是一样的,所以支持从1.0 到3.0
const float LOW_APIVERSUPPORT = 1.00; // API支持的最低版本
const float HIGH_APIVERSUPPORT = 3.00; // API支持的最高版本
const float LOW_SRVCVERSUPPORT = 3.00; // 支持的最低版本
const float HIGH_SRVCVERSUPPORT = 3.00; // 支持的最高版本
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
PrintData::PrintData()
{
}
PrintData::~PrintData()
{
}
// 将两个范围的版本号合成一个DWORD值表示的版本号
DWORD PrintData::dwCombineVersion(float p_fLow, float p_fHigh)
{
// 低位Word表示支持的最高版本,高位Word表示支持的最低版本
WORD l_wLow = wFloattoVersion(p_fLow);
WORD l_wHigh = wFloattoVersion(p_fHigh);
DWORD l_dwVer = MAKELONG(l_wHigh, l_wLow);
return l_dwVer;
}
// 将一个小数值转成版本表示的值
WORD PrintData::wFloattoVersion(float p_fVer)
{
// 每个Word的低位表示主要版本,高位表示次要版本
char l_acBuffer[5];
int l_iDec, l_iSign;
char *l_pcRet = NULL;
BYTE l_bLow, l_bHigh;
// 低位
l_pcRet = _fcvt(p_fVer, 2, &l_iDec, &l_iSign);
l_bLow = atoi(l_pcRet + l_iDec);
memset(l_acBuffer, 0, sizeof(l_acBuffer));
strncpy(l_acBuffer, l_pcRet, l_iDec);
l_bHigh = atoi(l_acBuffer);
WORD l_wVer = MAKEWORD(l_bHigh, l_bLow);
return l_wVer;
}
//////////////////////////////////////////////////////////////////////
// 功 能: 记录简单的日志信息
// 作 者: 刘永胜
// 输 入: 数据类型 变量名 说明
//
// 输 出: 数据类型 变量名 说明
//
// 返 回 值:
// 创建日期:
//////////////////////////////////////////////////////////////////////
void PrintData::Log(LPCTSTR strInfo)
{
TCHAR achTmp[128];
GetModuleFileName(NULL, achTmp, sizeof(achTmp));
for (INT i = strlen(achTmp); i>=0; i--)
{
if (achTmp[i] == '\\')
{
achTmp[i+1] = 0;
break;
}
}
strcat(achTmp,"Trace");
SYSTEMTIME DT;
GetLocalTime(&DT);
CString strLogPath;
strLogPath.Format("%s%04d%02d%02d",achTmp,DT.wYear,DT.wMonth,DT.wDay);
if (_access(strLogPath,0) != 0)
_mkdir(strLogPath);
FILE *fp;
if ((fp = fopen(strLogPath + "\\Journal.log", "a") ) != NULL)
{
fprintf(fp,"%02d:%02d:%02d %s", DT.wHour, DT.wMinute, DT.wSecond, strInfo);
fflush(fp);
fclose(fp);
}
OutputDebugString(strInfo);
}
//////////////////////////////////////////////////////////////////////
// 功 能: 接收线程的处理函数。完成调用API的接口进行打印功能
// 作 者: 刘永胜
// 输 入: 数据类型 变量名 说明
//
// 输 出: 数据类型 变量名 说明
//
// 返 回 值:
// 创建日期:
//////////////////////////////////////////////////////////////////////
DWORD WINAPI PrintData::PrintTestThread(void *p_pVoid)
{
PrintData* l_poPrintData;
l_poPrintData = (PrintData*)p_pVoid;
TCHAR l_acTempData[100];
memset(l_acTempData, 0x00, sizeof(l_acTempData));
l_poPrintData->m_ContinueFlag = TRUE; // 持续打印内容
// 下面是完整的XFS调用过程
// 启动XFS的环境
DWORD dwRVersion = l_poPrintData->dwCombineVersion(LOW_APIVERSUPPORT, HIGH_APIVERSUPPORT);
HRESULT hr = WFSStartUp(dwRVersion, &(l_poPrintData->m_wv)); //启动XFS Manager
if (FAILED(hr))
{
l_poPrintData->Log("WFSStartUp Fail\n");
return 1;
}
else
{
l_poPrintData->Log("WFSStartUp OK\n");
}
// 创建Application句柄
hr = WFSCreateAppHandle(&l_poPrintData->m_hXFSApp);
if (FAILED(hr))
{
l_poPrintData->Log("WFSCreateAppHandle Fail\n");
return 1;
}
else
{
l_poPrintData->Log("WFSCreateAppHandle OK\n");
}
// 打开流水打印机设备
WFSVERSION w;
DWORD l_dwSupVersion = l_poPrintData->dwCombineVersion(LOW_SRVCVERSUPPORT, HIGH_SRVCVERSUPPORT);
HSERVICE hService;
hr = WFSOpen(l_poPrintData->m_acLogicalName, l_poPrintData->m_hXFSApp, NULL, NULL,
WFS_INDEFINITE_WAIT, l_dwSupVersion, &l_poPrintData->m_wv, &w, &hService);
if (hr != WFS_SUCCESS)
{
sprintf(l_acTempData, "WFSOpen %s Fail %d\n", l_poPrintData->m_acLogicalName, hr);
l_poPrintData->Log(l_acTempData);
return 1;
}
// hr = WFSRegister(hService, SERVICE_EVENTS, theApp.GetSafeHwnd());
// hr = WFSRegister(hService, USER_EVENTS, theApp.GetSafeHwnd());
// hr = WFSRegister(hService, EXECUTE_EVENTS, theApp.GetSafeHwnd());
// 从文件中把打印数据拿出来
//打印原始数据
WFSPTRRAWDATA l_sRawData;
l_sRawData.wInputData = WFS_PTR_NOINPUTDATA;
l_sRawData.ulSize = strlen(l_poPrintData->m_acJournalData);
l_sRawData.lpbData = (LPBYTE)(l_poPrintData->m_acJournalData);
WFSRESULT* pResult = NULL;
// 加锁
hr = WFSLock(hService, WFS_INDEFINITE_WAIT, &pResult);
while(l_poPrintData->m_ContinueFlag)
{
// 不断打印数据到流水打印纸上
hr = WFSExecute(hService, WFS_CMD_PTR_RAW_DATA, (LPVOID)&l_sRawData, WFS_INDEFINITE_WAIT, &pResult);
if (WFS_SUCCESS == hr)
{
}
else
{
sprintf(l_acTempData, "WFSExecute Fail %d\n", hr);
l_poPrintData->Log(l_acTempData);
}
Sleep(20);
}
// 解锁
hr = WFSUnlock(hService);
WFMFreeBuffer(&l_sRawData);
return 0;
}
// 打印流水
INT PrintData::PrintJounalData()
{
TCHAR achTmp[128];
memset(achTmp, 0x00, sizeof(achTmp));
GetModuleFileName(NULL, achTmp, sizeof(achTmp));
for (int i = strlen(achTmp); i>=0; i--)
{
if (achTmp[i] == '\\')
{
achTmp[i+1] = 0;
break;
}
}
strcat(achTmp,"\\JournalData.ini"); // 找到当前EXE所在路径,然后定位到配置文件的路径
memset(m_acJournalData, 0x00, sizeof(m_acJournalData)); // 清空
memset(m_acLogicalName, 0x00, sizeof(m_acLogicalName));
// 取配置信息
TCHAR sTempBuf[256];
memset(sTempBuf, 0x00, sizeof(sTempBuf));
GetPrivateProfileString("TestData", "JournalTestData", "This is a test data ~!@#$%^&*()_+", sTempBuf, 256, achTmp);
memcpy(m_acJournalData, sTempBuf, strlen(sTempBuf));
memset(sTempBuf, 0x00, sizeof(sTempBuf));
GetPrivateProfileString("LogicalName", "Name", "JournalPrinter", sTempBuf, 256, achTmp);
memcpy(m_acLogicalName, sTempBuf, strlen(sTempBuf));
// 创建打印线程
DWORD dwThread = 0;
m_hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)PrintTestThread, (void *)this, NULL, &dwThread);
return 0;
}
BOOL PrintData::bExit()
{
m_ContinueFlag = FALSE;
DWORD l_dwRet = WaitForSingleObject(m_hThread, 6000);
if (WAIT_OBJECT_0 != l_dwRet)
{
TerminateThread(m_hThread, 100);
}
m_hThread = NULL;
return TRUE;
}
kanb007
- 粉丝: 10
- 资源: 7
最新资源
- 上课教材ppt-数据库系统原理及MySQL应用教程(第二版)课件.zip
- usb gadget 学习资料
- 智能毕设项目开发基础教程
- 实用脚本工具:自动化编程基础教程
- LabVIEW编程入门与实践基础教程
- 嵌入式开发入门与实践基础教程
- JFinal-Python资源
- 胆小菇 Python Selenium 爬虫入门:批量将豆瓣书影标记设置为"仅自己可见"
- bboss-plugins-kafka
- iotucy-websocket
- 胆小菇 Python Selenium 爬虫入门:批量将豆瓣书影标记设置为"仅自己可见"
- StudentManageSystem-建立学生信息链表
- Sa-Token-java
- 基于Atlas 200I DK A2研究的机械臂目标检测系统-注意力机制
- ga_network_reconfiguration-遗传算法
- tomcat-tomcat
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
- 4
前往页