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
???????
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
???????
pJobInfo->pDocument 这个是打印机的文档名称 在msdn JOB_INFO_2是 LPTSTR 类型 我在u模式下 ddk编译 他成了LPWSTR
无论我怎么改 他都写不出正确的名字
他写出<Log><printlog><job_id>+一堆乱码
要么全ANSI,要么全Unicode(头两个字符为FFFE)
当然了,也可以全部转换成ANSI,思路类似。
编码、要一直
我从来没学过这东西啃了一个周的 代码 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编译 我试了 模仿其他例子 用 宏 但是报错 怎么正确的写
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);
// 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,视你的项目要求而定。
bRet = WriteFile(hDIBFile, pJobInfo->pDocument, _tcslen(pJobInfo->pDocument) * sizeof(TCHAR), &NumByteWritten, NULL);
就卡住了我把spoolsv.exe 进程结束 才行