- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在从事一个旨在监控打印作业的项目。我正在将 spl 和 shd 文件从 spool 文件夹复制到一个临时文件夹,并尝试解析以获取我想要的数据,例如打印页数、所有者、日期和时间...
我正在使用以下代码来解析后台处理程序 spl 文件(获取 emf 文件结构)
#include "stdafx.h"
#include <windows.h>
#include <winspool.h>
#include <stdio.h>
#include <locale.h>
#include <tchar.h>
#include <iostream>
using namespace std;
BOOL AnalyseFile(const char* pszFileName);
void UPFM(const wchar_t pszInfo[])
{
wprintf(L"%s\n",pszInfo);
}
static char* ID_Func[] =
{
"EMF_HEADER", "EMF_POLYBEZIER", /*....*/
};
int main()
{
setlocale(LC_ALL,"");
const char* pszFileName = "~MyTempFolder\\00031.SPL";
if(!AnalyseFile(pszFileName))
printf("Analyse File Failed!");
else
printf("Analyse File Successed Completed!");
return 0;
}
BOOL AnalyseFile(const char* pszFileName)
{
BOOL bRet = FALSE;
DWORD dwStartPos = 0;
FILE * f ;
f = fopen("log.txt", "w");
FILE* pFile = fopen(pszFileName,"rb");
if(!pFile)
{
fprintf(f,"Open File Failed!");
return bRet;
}
/* =======================Headers================================ */
DWORD dwTmp = 0;
fseek(pFile,0,0);
fread(&dwTmp,sizeof(DWORD),1,pFile);
fread(&dwTmp,sizeof(DWORD),1,pFile);
dwStartPos = dwTmp;
fread(&dwTmp,sizeof(DWORD),1,pFile);
long pos = ftell(pFile);
fseek(pFile,dwTmp,SEEK_SET);
wchar_t pszInfo[256] = {0};
pszInfo[0] = L'(';
WORD wTmp;
int i;
for( i = 1;;i++)
{
fread(&wTmp,sizeof(wTmp),1,pFile);
if(!wTmp)
break;
memcpy((char*)&pszInfo[i],&wTmp,sizeof(wTmp));
}
pszInfo[i] = L')';
UPFM(pszInfo);
fseek(pFile,pos,SEEK_SET);
fread(&dwTmp,sizeof(DWORD),1,pFile);
fseek(pFile,dwTmp,SEEK_SET);
memset(pszInfo,0,sizeof(wchar_t)*256);
pszInfo[0] = L'(';
for(i = 1;;i++)
{
fread(&wTmp,sizeof(wTmp),1,pFile);
if(!wTmp)
break;
memcpy((char*)&pszInfo[i],&wTmp,sizeof(wTmp));
}
pszInfo[i] = L')';
UPFM(pszInfo);
/* ======================== Unknown datas ================================= */
fseek(pFile,dwStartPos,SEEK_SET);
fread(&dwTmp,sizeof(DWORD),1,pFile);
fread(&dwTmp,sizeof(DWORD),1,pFile);
/* ======================== Record datas ================================= */
DWORD dwTmp2 = 0;
for(int i=0;;i++)
{
pos = ftell(pFile);
fread(&dwTmp,sizeof(DWORD),1,pFile);
fread(&dwTmp2,sizeof(DWORD),1,pFile);
FILE *f;
f = fopen("log.txt", "a");
fprintf(f,"index: (%04d) type: 0x%04X size: %04d 0x%08X (%s)\n",i,dwTmp,dwTmp2,pos,ID_Func[dwTmp-1]);
fclose (f);
if(dwTmp == 0x0E)
{
break;
}
fseek(pFile,pos+dwTmp2,SEEK_SET);
}
fclose (f);
if(pFile) fclose(pFile);
bRet = TRUE;
return bRet;
}
有没有办法用这种方法计算spl文件的页数?
最佳答案
要计算页面,您必须计算 PAGE 标题。
下面是部分代码
SpoolFilename = Path.ChangeExtension(SpoolFilename, ".SPL")
'\\ Open a binary reader for the spool file
Dim SpoolFileStream As New System.IO.FileStream(SpoolFilename, FileMode.Open, FileAccess.Read)
Dim SpoolBinaryReader As New BinaryReader(SpoolFileStream, System.Text.Encoding.UTF8)
'Read the spooler records and count the total pages
Dim recNext As EMFMetaRecordHeader = NextHeader(SpoolBinaryReader)
While recNext.iType <> SpoolerRecordTypes.SRT_EOF
If recNext.iType = SpoolerRecordTypes.SRT_PAGE Then
_Pages += 1
End If
'SpoolfileReaderPerformaceCounter.Increment()
Call SkipAHeader(recNext, SpoolBinaryReader)
recNext = NextHeader(SpoolBinaryReader)
End While
代码获取文件名,为其打开二进制流,并逐个读取 header 。如果 header 代码是 SRT_PAGE,则增加页面计数器。
更多详细信息和来源 here
关于c++ - 如何获取spl文件的页数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25205317/
普通数组、SPL 数组和 SPL 数据存储之间的区别、*用法*场景是什么?如果有人能给出一些使用 SPLarray 和 SPL objectsrorage 的实际例子,那就太好了。 最佳答案 SplF
在 java 和 C++ 中,当我们不知道大小时 - 不像在 PHP 中那样使用数组,而是使用 linkedList 等。 在 PHP 中存在 SPL,但大多数时候程序员使用数组,为什么(因为人们不了
数据库语言的目标 要说清这个目标,先要理解数据库是做什么的。 数据库这个软件,名字中有个“库”字,会让人觉得它主要是为了存储的。其实不然,数据库实现的重要功能有两条:计算、事务!也就是我们常说的 OL
数据库语言的目标 要说清这个目标,先要理解数据库是做什么的。 数据库这个软件,名字中有个“库”字,会让人觉得它主要是为了存储的。其实不然,数据库实现的重要功能有两条:计算、事务!也就是我们常说的OLA
需要的MAVEN依赖 org.springframework.boot spring-boot-starter-parent 2.3.2.RELEAS
下载和安装 http://www.raqsoft.com.cn/download/download-jsq 拿到安装包后执行安装程序,按提示逐步进行: 运行安装程序 按照提示,依次点击下一步,接受许可
SPL官网 http://www.scudata.com.cn/ 介绍 业务逻辑经常包含较复杂的流程和计算,同时涉及数据库的读写。由于授权麻烦、影响数据库安全、无法迁移、技术要求高、编写困难等原因,很
下载和安装 http://www.raqsoft.com.cn/download/download-jsq 拿到安装包后执行安装程序,按提示逐步进行: 运行安装程序 按照提示,依次点击下一步,接受许可
SPL官网 http://www.scudata.com.cn/ 介绍 业务逻辑经常包含较复杂的流程和计算,同时涉及数据库的读写。由于授权麻烦、影响数据库安全、无法迁移、技术要求高、编写困难等原因,很
我知道要计算声压级(db SPL)是 20 * log10 (amplitude) 但是我在这里不明白的是值的范围。如果是16位带符号PCM音频,则最小值为-90,最大值为0: [20 * log10
在服务器端的 include_path 中,我有一个 pear 目录的引用,位于“/usr/share/pear/”中。在我的应用程序中,我包含来自公共(public)库的文件,这些文件位于“/usr
通过网络浏览后,我设法构建了一个有效的 SPL_Autoload 并在其中使用了命名空间。它确实有效,但与我正在查看的所有示例和文档相比,它对我来说也有点奇怪。我是否使用了所有内容并正确理解了它? $
我正在研究标准 PHP 库 (SPL)。以前只用过数组,现在才发现PHP有这么多标准类。但是说明书上并没有说推荐使用与否。例如,他们明确建议使用 foreach 构造来迭代数组,因为它更快。那么这个图
本文实例讲述了PHP标准库 (SPL)——Countable用法。分享给大家供大家参考,具体如下: 类实现 Countable 可被用于 count() 函数. 接口摘要
我对这三个问题的概念很迷茫 为什么我们需要辅助程序加载器? 它在哪个内存中加载和重定位? 系统内存和RAM有什么区别? 据我通过阅读链接了解到的是.. 当系统内部存储器不能完全容纳 uboot 时需要
有没有办法在 PHP 中从 SPL 自动加载器抛出异常以防失败?它似乎不能在 PHP 5.2.11 下工作。 class SPLAutoLoader{ public static functi
我正在为如何使用 SPL 迭代器删除 PHP 中的空目录树而苦恼。考虑以下目录结构,其中所有目录都是空的: /topdir level1 level2 我试过以下方法: $it =
如何使用 SPL(可能使用 RecursiveDirectoryIterator 和 RecursiveIteratorIterator)检索完整的目录树? 最佳答案 默认情况下,RecursiveI
我可以在 http://www.php.net/~helly/php/ext/spl/... 找到定义文件,但我想扩展 DirectoryIterator和 SplFileInfo在存储在数据库上的虚
我正在尝试使用 spl_autoload_register 并且我想创建一个 if() 语句来检查类方法是否已经注册。 例如: if (spl_autoload_function(array($thi
我是一名优秀的程序员,十分优秀!