■■如何把驱动中截取的信息正确的写入到文件中??????????

terranghost 2007-02-04 02:29:26
DWORD pcbNeeded=0;
DWORD pcReturned=0;
JOB_INFO_2 * pJobInfo=NULL;
SYSTEMTIME st;
pJobInfo = (JOB_INFO_2 *) LocalAlloc(LPTR, pcbNeeded);
GetJob(pdevobj->hPrinter,dwJobId,1,(LPBYTE)pJobInfo,pcbNeeded,(LPDWORD)&pcReturned);

HANDLE hDIBFile = NULL;
hDIBFile = CreateFile(TEXT("c:\\ffdgfaa4aa.xml"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
BOOL bRet = FALSE;
DWORD NumByteWritten = 0;
char *log="<Log><printlog><job_id>";

//int iSize;
//char* pszMultiByte;
//
//iSize = WideCharToMultiByte(CP_ACP, 0, pJobInfo->pDocument, -1, NULL, 0, NULL, NULL);
//pszMultiByte = (char*)malloc((iSize+1)/**sizeof(char)*/);
//WideCharToMultiByte(CP_ACP, 0, pJobInfo->pDocument, -1, pszMultiByte, iSize, NULL, NULL);
bRet = WriteFile(hDIBFile,log,strlen(log) , &NumByteWritten, NULL);
bRet = WriteFile(hDIBFile,pJobInfo->pDocument,sizeof(pJobInfo->pDocument), &NumByteWritten, NULL);
CloseHandle(hDIBFile);


写到文件中的东西是乱码!!!!!!!!!!!!!!!!!!!!
why
???????
...全文
214 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
terranghost 2007-02-06
  • 打赏
  • 举报
回复
我解决了

给分 结贴

分不多 别见怪
terranghost 2007-02-05
  • 打赏
  • 举报
回复
ATField(field) 按照你的写法 我写了 当打印机打印的时候 驱动执行到
bRet = WriteFile(hDIBFile, pJobInfo->pDocument, _tcslen(pJobInfo->pDocument) * sizeof(TCHAR), &NumByteWritten, NULL);
就卡住了

我把spoolsv.exe 进程结束 才行
terranghost 2007-02-05
  • 打赏
  • 举报
回复
bRet = WriteFile(hDIBFile, byteOrder, sizeof(lpByteOrder), &NumBytesWritten, NULL);

lpByteOrder是什么? 编译报错

我把lp去了 把B改成b了
ATField 2007-02-05
  • 打赏
  • 举报
回复
可以这样写:
// Unicode的情况下写入文件头0xff, 0xfe
#ifdef _UNICODE
BYTE byteOrder[2];
byteOrder[0] = 0xff; byteOrder[1] = 0xfe;
bRet = WriteFile(hDIBFile, byteOrder, sizeof(lpByteOrder), &NumBytesWritten, NULL);
#endif

// 写入pDocument的内容,不应该用sizeof,sizeof得到的是指针的大小,32位平台上面是4,应该用_tcslen
bRet = WriteFile(hDIBFile, pJobInfo->pDocument, _tcslen(pJobInfo->pDocument) * sizeof(TCHAR), &NumByteWritten, NULL);

上面的代码在不同编译选项的情况下写出的文件格式不一样,不是很好。你也可以统一在不同的编译选项下面输出相同格式,比如都是Unicode或者ANSI,视你的项目要求而定。
terranghost 2007-02-04
  • 打赏
  • 举报
回复
这样类型就统一了吧 怎么还不行
terranghost 2007-02-04
  • 打赏
  • 举报
回复
DWORD pcbNeeded=0;
DWORD pcReturned=0;
JOB_INFO_2 * pJobInfo=NULL;
SYSTEMTIME st;
pJobInfo = (JOB_INFO_2 *) LocalAlloc(LPTR, pcbNeeded);
GetJob((HANDLE)pdevobj->hPrinter,dwJobId,2,(LPBYTE)pJobInfo,pcbNeeded,(LPDWORD)&pcReturned);
HANDLE hDIBFile = NULL;
hDIBFile = CreateFile(TEXT("c:\\ffdgfaa4aa.xml"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
BOOL bRet = FALSE;
DWORD NumByteWritten = 0;
bRet = WriteFile(hDIBFile, pJobInfo->pDocument,sizeof( pJobInfo->pDocument) , &NumByteWritten, NULL);
CloseHandle(hDIBFile);
terranghost 2007-02-04
  • 打赏
  • 举报
回复
我糊涂了 能不能给个正确的写法?????
我从来没学过这东西

啃了一个周的 代码 ddk 你们说的这些 我也不是很明白

为什么注释掉WideCharToMultiByte?
==================
因为我用这个函数转换出来的也是乱码
=================================
要么全ANSI,要么全Unicode(头两个字符为FFFE)
==========
不明白




在你的代码中,前面log是ANSI,而后面pDocument是LPTSTR,会根据编译选项而变化,因此在Unicode编译下会造成乱码(如果是ANSI就不会有此问题)。建议全部转换为Unicode,把Log声明成LPCTSTR lpcszLog = _T("....");,然后把pDocument转换成Unicode(在ANSI编译下pDocument应该是ANSI,所以需要转换,而在Unicode下无需转换),可以用ATL的宏T2W来作此转换,可以正确处理Unicode和非Unicode的情况,而不能直接使用MultiByteToWideChar等函数。文件头最好再加上字节顺序编码,如0xFFFE。
当然了,也可以全部转换成ANSI,思路类似。



我不能用ATL T2W 之类的 这个是ddk编译 我试了 模仿其他例子 用 宏 但是报错

怎么正确的写
bobob 2007-02-04
  • 打赏
  • 举报
回复
要么全ANSI,要么全Unicode
编码、要一直

ATField 2007-02-04
  • 打赏
  • 举报
回复
在你的代码中,前面log是ANSI,而后面pDocument是LPTSTR,会根据编译选项而变化,因此在Unicode编译下会造成乱码(如果是ANSI就不会有此问题)。建议全部转换为Unicode,把Log声明成LPCTSTR lpcszLog = _T("....");,然后把pDocument转换成Unicode(在ANSI编译下pDocument应该是ANSI,所以需要转换,而在Unicode下无需转换),可以用ATL的宏T2W来作此转换,可以正确处理Unicode和非Unicode的情况,而不能直接使用MultiByteToWideChar等函数。文件头最好再加上字节顺序编码,如0xFFFE。
当然了,也可以全部转换成ANSI,思路类似。
vcmute 2007-02-04
  • 打赏
  • 举报
回复
为什么注释掉WideCharToMultiByte?
要么全ANSI,要么全Unicode(头两个字符为FFFE)
terranghost 2007-02-04
  • 打赏
  • 举报
回复
pJobInfo->pDocument 关键是这个是乱码

char *log="<Log><printlog><job_id>";可以正常显示


pJobInfo->pDocument 这个是打印机的文档名称 在msdn JOB_INFO_2是 LPTSTR 类型 我在u模式下 ddk编译 他成了LPWSTR
无论我怎么改 他都写不出正确的名字
他写出<Log><printlog><job_id>+一堆乱码
bobob 2007-02-04
  • 打赏
  • 举报
回复
char *log="<Log><printlog><job_id>";

=============>

TCHAR log[255] = TEXT("<Log><printlog><job_id>");

terranghost 2007-02-04
  • 打赏
  • 举报
回复
mfc 下

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧