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
???????

解决方案 »

  1.   

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

  2.   

    pJobInfo->pDocument 关键是这个是乱码char *log="<Log><printlog><job_id>";可以正常显示
    pJobInfo->pDocument 这个是打印机的文档名称 在msdn JOB_INFO_2是  LPTSTR 类型 我在u模式下 ddk编译 他成了LPWSTR  
    无论我怎么改 他都写不出正确的名字
    他写出<Log><printlog><job_id>+一堆乱码
      

  3.   

    为什么注释掉WideCharToMultiByte?
    要么全ANSI,要么全Unicode(头两个字符为FFFE)
      

  4.   

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

  5.   

    要么全ANSI,要么全Unicode
    编码、要一直
      

  6.   

    我糊涂了 能不能给个正确的写法?????
    我从来没学过这东西啃了一个周的 代码  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编译  我试了 模仿其他例子 用 宏 但是报错  怎么正确的写
      

  7.   

    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);
      

  8.   

    可以这样写:
    // 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,视你的项目要求而定。
      

  9.   

    bRet = WriteFile(hDIBFile, byteOrder, sizeof(lpByteOrder), &NumBytesWritten, NULL);lpByteOrder是什么? 编译报错我把lp去了 把B改成b了
      

  10.   

    ATField(field) 按照你的写法 我写了 当打印机打印的时候 驱动执行到
    bRet = WriteFile(hDIBFile, pJobInfo->pDocument, _tcslen(pJobInfo->pDocument) * sizeof(TCHAR), &NumByteWritten, NULL);
    就卡住了我把spoolsv.exe 进程结束 才行