⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 monitor.cpp

📁 打印机监视器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	PORT *pPort=(PORT*)hPort;
	BOOL bRetPhysics=false;
	BOOL bRetAgent=false;
	TCHAR s[MAX_PATH];
	//检查文档创建结果:
	if(pPort->hFile==NULL)
	{
		Error(_T("代理文档没有创建成功,无法输出文档"));
		return false;
	}

	if(pPort->dwJobIdPhysics = 0)
	{
		_tcscpy(s,_T("物理打印机上文档标记为零(还没开始文档),无法输出在:"));
		_tcscat(s,pPort->sPrinterPhysics);

		Error(s);
		return false;
	}
	if(pPort->sPrinterPhysics==NULL)
	{
		Error(_T("没有关联物理打印机,无法输出!"));
		return false;
	}
	if(pPort->hPrinterPhysics==NULL)
	{

		_tcscpy(s,_T("物理打印机句柄空(尚未打开),无法打印在:"));
		_tcscat(s,pPort->sPrinterPhysics);
		::Error(s);
		return false;
	}
	//取得用户信息:
	if(pPort->sUser[0]==0)
	{
		if(::getJobUser(pPort,pPort->sUser))
		{
			TCHAR userPath[MAX_PATH];
			_tcscpy(userPath,pPort->sPath);
			_tcscat(userPath,pPort->sUser);
			if(!CreateDirectory(userPath,NULL))
			{
				_tcscpy(s,_T("Can't Create User Directory:"));
				_tcscat(s,userPath);
				TCHAR s1[MAX_PATH];
				_tcscat(s,formatLastError(s1));
				Error(s);

			}
		}
	}
	//输出到物理打印机:
	DWORD cbWritten=0;
	bRetPhysics=::WritePrinter(pPort->hPrinterPhysics,pBuffer,cbBuf,&cbWritten);
	if(bRetPhysics)
	{
		_tcscpy(s,_T("在物理打印机:"));
		_tcscat(s,pPort->sPrinterPhysics);
		_tcscat(s,_T("上输出成功"));
		::Debug(s);

	}
	else
	{
		_tcscpy(s,_T("在物理打印机:"));
		_tcscat(s,pPort->sPrinterPhysics);
		_tcscat(s,_T("上输出失败"));
		TCHAR s1[MAX_PATH];
		_tcscat(s,formatLastError(s1));
		::Error(s);
	}

	//输出到代理文件:	
	bRetAgent=WriteFile(
		pPort->hFile,
		pBuffer,
		cbBuf,
		pcbWritten,
		NULL);


	if(!bRetAgent)
	{
		_tcscpy(s,_T("在代理打印机:"));
		_tcscat(s,pPort->sPrinterLocalDirectory);
		_tcscat(s,_T("上输出失败"));
		TCHAR s1[MAX_PATH];
		_tcscat(s,formatLastError(s1));
		::Error(s);
	}
	if((!bRetAgent)||(!bRetPhysics))
	{
		HANDLE hPrinter;
		if(OpenPrinter(pPort->sPrinterLocalDirectory,&hPrinter,NULL))
		{
			SetJob(
				hPrinter,
				pPort->dwJobID,
				0,
				NULL,
				JOB_CONTROL_RESTART);

			SetJob(
				hPrinter,
				pPort->dwJobID,
				0,
				NULL,
				JOB_CONTROL_PAUSE);

			CloseHandle(hPrinter);
		}
		SetJob(
			pPort->hPrinterPhysics,
			pPort->dwJobIdPhysics,
			0,
			NULL,
			JOB_CONTROL_RESTART);

		SetJob(
			pPort->hPrinterPhysics,
			pPort->dwJobIdPhysics,
			0,
			NULL,
			JOB_CONTROL_PAUSE);
	}


	// always return TRUE
	// ->returning FALSE leads to an useless error message 
	return TRUE;	
}

BOOL WINAPI MyReadPort(
					   HANDLE hPort,
					   LPBYTE pBuffer,
					   DWORD  cbBuf,
					   LPDWORD pcbRead)
{
	::Debug(_T("执行顺序7:WaitForOutput(char *paramPath, DWORD dwTimeout)"));
	return TRUE;
}

BOOL WINAPI MyEndDocPort(HANDLE hPort)
{
	::Debug(_T("执行顺序10:WaitForOutput(char *paramPath, DWORD dwTimeout)"));
	PORT *pPort=(PORT*)hPort;

	CAutoLocker a;
	TCHAR s[MAX_PATH];
	if(pPort->sPrinterPhysics[0]==0)
	{
		Error(_T("没有关联物理打印机,无法停止文档!"));
	}
	if(pPort->hPrinterPhysics==NULL)
	{
		_tcscpy(s,_T("无法停止文档,物理打印机句柄为零:"));
		_tcscat(s,pPort->sPrinterPhysics);
		::Error(s);
	}
	if(pPort->hFile==NULL)
	{
		Error(_T("没有创建代理文档,无法停止文档!"));
	}
	if(pPort->dwJobID==0)
	{
		Error(_T("代理打印机任务标记为零,无法停止文档!"));
	}


	//停止物理打印机文档:
	BOOL bRet=::EndDocPrinter(pPort->hPrinterPhysics);
	CloseHandle(pPort->hPrinterPhysics);
	pPort->hPrinterPhysics=0;
	if(!bRet)
	{
		_tcscpy(s,_T("在物理打印机:"));
		_tcscat(s,pPort->sPrinterPhysics);
		_tcscat(s,_T("上结束文档失败,"));
		TCHAR s1[MAX_PATH];
		_tcscat(s,formatLastError(s1));

		::Error(s);
	}


	//停止代理打印机文档:	

	FlushFileBuffers(pPort->hFile);
	CloseHandle(pPort->hFile);
	PulseEvent(m_hEvent);


	//打印完毕移动文件到用户目录:
	TCHAR filepath[MAX_PATH];
	TCHAR filepathUser[MAX_PATH];
	getFileFullPath(pPort->sPath,_T(""),pPort->sCurDocument,filepath);
	getFileFullPath(pPort->sPath,pPort->sUser,pPort->sCurDocument,filepathUser);
	if(!CopyFile(filepath,filepathUser,true))
	{
		SYSTEMTIME t;
		::GetSystemTime(&t);
		TCHAR tc[100];

		_stprintf(tc,_T("%u-%u-%u-%u-%u-%u"),t.wYear,t.wMonth,t.wDay,t.wHour,t.wMinute,t.wSecond);
		_tcscat(filepathUser,tc);
		if(!CopyFile(filepath,filepathUser,true))
		{
		_tcscpy(s,_T("复制文件:"));
		_tcscat(s,filepath);
		_tcscat(s,_T("到:"));
		_tcscat(s,filepathUser);
		_tcscat(s,_T(","));
		TCHAR s1[MAX_PATH];
		_tcscat(s,formatLastError(s1));

		::Error(s);
		}
	}




	//设置代理打印机状态:

	_tcscpy(pPort->sCurDocument,_T(""));
	pPort->dwStatus &= ~PS_STARTDOC;
	pPort->hFile=NULL;
	//删除代理任务:

	HANDLE hPrinter;
	if(OpenPrinter(pPort->sPrinterLocalDirectory,&hPrinter,NULL))
	{
		Debug(_T("force enddocport!"));
		SetJob(
			hPrinter,
			pPort->dwJobID,
			0,
			NULL,
			JOB_CONTROL_DELETE);

		CloseHandle(hPrinter);
	}
	pPort->dwJobID=0;




	return TRUE;
}

BOOL WINAPI MyClosePort(HANDLE hPort)
{
	::Debug(_T("执行顺序13:WaitForOutput(char *paramPath, DWORD dwTimeout)"));
	CAutoLocker a;
	Debug(_T("ClosePort"));
	PORT *pPort=(PORT*)hPort;
	pPort->dwStatus &= ~PS_OPENED;

	return TRUE;
}
BOOL selectPrinter(TCHAR *sPrinterName)
{
	::Debug(_T("执行顺序3:WaitForOutput(char *paramPath, DWORD dwTimeout)"));
	PRINTDLG pd; 
	ZeroMemory(&pd, sizeof(PRINTDLG)); 
	pd.lStructSize = sizeof(PRINTDLG); 
	pd.Flags = PD_PRINTSETUP; 
	if (PrintDlg(&pd)) 
	{ 
		LPDEVNAMES lpdn = (LPDEVNAMES)GlobalLock(pd.hDevNames); 
		_tcscpy(sPrinterName,(LPTSTR)lpdn + lpdn->wDeviceOffset );
		GlobalUnlock(pd.hDevNames); 
		GlobalFree(pd.hDevNames); 
		GlobalFree(pd.hDevMode);  

		::Debug(_T("增加端口:"));
		::Debug(sPrinterName);
		return true;
	} 
	else
	{
		return false;
	}


}
BOOL WINAPI MyAddPort(
					  LPWSTR pName,
					  HWND hWnd,
					  LPWSTR pMonitorName)
{

	::Debug(_T("执行顺序15:MyAddPort"));
	Debug(_T("AddPort"));
	TCHAR sPath[MAX_PATH];
	TCHAR sPrinterPhysics[100];
	/*
	BROWSEINFO bi;

	bi.hwndOwner=hWnd;
	bi.pidlRoot=NULL;
	TCHAR buf[MAX_PATH];
	bi.pszDisplayName=buf;
	bi.lpszTitle=_T("您好大侠,请选择输出的目录:");
	bi.ulFlags=BIF_RETURNONLYFSDIRS;
	bi.lpfn=NULL;
	bi.lParam=0;
	int iImage=0;
	bi.iImage=iImage;

	ITEMIDLIST *pidl=SHBrowseForFolder(&bi);
	BOOL b=selectPrinter(sPrinterPhysics);


	if(pidl&&b)//user did not cancel
	{
	SHGetPathFromIDList(pidl,sPath);

	IMalloc *pMalloc;
	SHGetMalloc(&pMalloc);

	pMalloc->Free(pidl);
	pMalloc->Release();
	*/
INPUTPATH:
	CDialogPathAndPrinter dlg(CDialogPathAndPrinter::IDD,hWnd);
	if(dlg.DoModal()!=IDOK)return false;
	_tcscpy(sPath,dlg.getPath());
	_tcscpy( sPrinterPhysics,dlg.getPrinterNamePhysics());
	if(sPath[0]==0)
	{
		MessageBox(hWnd,_T("非法目录"),_T("错误"),MB_OK);
		return false;
	}
	if(sPrinterPhysics[0]==0)
	{
		MessageBox(hWnd,_T("非法打印机"),_T("错误"),MB_OK);
		return false;
	}


	if(sPath[_tcslen(sPath)-1]!=_T('\\'))
		_tcscat(sPath,_T("\\"));

	DWORD err;
	if(PortExists(NULL,sPath,&err))
	{
		TCHAR s[MAX_PATH];
		_tcscpy(s,_T("您好大侠,不能添加端口,已有同名目录的端口的.是否选择另一个目录?"));
		if(IDYES==::MessageBox(hWnd,s,_T("端口已经存在"),MB_YESNO))
		{
			goto INPUTPATH;
		}
		else
		{
			return false;
		}
	}
	else
	{
		CAutoLocker a;
		m_portlist->AddPort(sPath,sPrinterPhysics,0);
		::Debug(_T("AddPort,打印机名:"));
		::Debug(sPrinterPhysics);
		m_portlist->Save(m_sRegistryRoot);
	}


	return TRUE;
}

BOOL WINAPI MyAddPortEx(
						LPWSTR	pName,
						DWORD	Level,
						LPBYTE	pBuffer,
						LPWSTR	pMonitorName)
{
	::Debug(_T("执行顺序14:MyAddPortEx"));
	return TRUE;
}

BOOL WINAPI MyConfigurePort(
							LPWSTR	pName,
							HWND	hWnd,
							LPWSTR	pPortName)
{
	::Debug(_T("执行顺序12:MyConfigurePort"));
	MessageBox(hWnd,_T("您好大侠,不支持配置端口.\n\n想改变输出路径,请增加一个."),szLocalMonitor,MB_OK);
	return TRUE;
}

BOOL WINAPI MyDeletePort(
						 LPWSTR	pName,
						 HWND	hWnd,
						 LPWSTR	pPortName)
{
	::Debug(_T("执行顺序11:MyDeletePort"));
	CAutoLocker a;

	if(m_portlist->DeletePort(pPortName))
	{
		m_portlist->Save(m_sRegistryRoot);

		TCHAR s[512];
		_stprintf(s,_T("您好大侠,端口\"%s\" 被成功删除."),pPortName);
		MessageBox(hWnd,s,s,MB_OK);
		return TRUE;
	}
	else
	{
		TCHAR s[512];
		_stprintf(s,_T("您好大侠,发生未知错误\n\n不能删除端口\"%s\"!"),pPortName);
		MessageBox(hWnd,s,_T("错误"),MB_OK);
	MessageBox(hWnd,_T("."),_T("错误"),MB_OK);
	}

	// always return TRUE
	// ->returning FALSE leads to an useless error message 
	return TRUE;	
}

BOOL IsFileReady(TCHAR *sPath)
{
	::Debug(_T("执行顺序16:IsFileReady"));
	HANDLE hFile=CreateFile(
		sPath,
		GENERIC_READ,
		FILE_SHARE_WRITE|FILE_SHARE_READ,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		NULL);

	if(hFile==INVALID_HANDLE_VALUE)
	{
		return FALSE;
	}
	else
	{
		CloseHandle(hFile);
		return TRUE;
	}
}

BOOL WINAPI WaitForOutput(char *paramPath, DWORD dwTimeout)
{
	::Debug(_T("执行顺序1:WaitForOutput"));
	TCHAR sPath[MAX_PATH];
	mbstowcs(sPath,paramPath,strlen(paramPath)+1);

	if(IsFileReady(sPath))
		return TRUE;

	HANDLE hEvent;
	hEvent=OpenEvent(SYNCHRONIZE,FALSE,szLocalMonitor);

	LARGE_INTEGER liCurrentTime;
	GetSystemTimeAsFileTime((FILETIME*)&liCurrentTime);

	LARGE_INTEGER liEndTime;
	liEndTime.QuadPart=liCurrentTime.QuadPart + dwTimeout;

	DWORD dwNextTimeout=dwTimeout;

	do
	{
		WaitForSingleObject(hEvent,dwNextTimeout+100);//respect time resolution
		if(IsFileReady(sPath))
		{
			CloseHandle(hEvent);
			return TRUE;
		}

		GetSystemTimeAsFileTime((FILETIME*)&liCurrentTime);
		dwNextTimeout=(unsigned long)((liEndTime.QuadPart-liCurrentTime.QuadPart)/10000);
	}while(dwNextTimeout>0 && dwNextTimeout<=dwTimeout);

	CloseHandle(hEvent);
	return IsFileReady(sPath);	
}

MONITOREX MonitorEx = {	
	sizeof(MONITOR),
	{
		MyEnumPorts,
			MyOpenPort,
			NULL,				//OpenPortEx
			MyStartDocPort,
			MyWritePort,
			MyReadPort,
			MyEndDocPort,
			MyClosePort,
			MyAddPort,
			MyAddPortEx,
			MyConfigurePort,
			MyDeletePort,
			NULL,				//MyGetPrinterDataFromPort
			NULL				//MySetPortTimeOuts
	}
};

LPMONITOREX WINAPI InitializePrintMonitor(
	LPWSTR pRegistryRoot)
{
	::Debug(_T("执行顺序17:InitializePrintMonitor"));
	::Debug(pRegistryRoot);
	::Debug(_T("执行顺序17:InitializePrintMonitor  完毕"));

	if(m_sRegistryRoot)
		free((void*)m_sRegistryRoot);
	m_sRegistryRoot=_tcsdup(pRegistryRoot);


	m_hEvent=CreateEvent(NULL,FALSE,FALSE,szLocalMonitor);

	CAutoLocker a;
	m_portlist->Load(m_sRegistryRoot);

	return &MonitorEx;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -