下面我把各个函数贴出来int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
   DWORD dwThreadId; 
   STARTUPINFO sui;
   HANDLE hThread;
   LPTSTR lpszMutexname = "StartHELPsMutex"; 
   
        hThread = CreateThread( 
            NULL,              // no security attribute 
            0,                 // default stack size 
            (LPTHREAD_START_ROUTINE) WindowThread, 
            (LPVOID)hInstance, // thread parameter 
            0,                 // not suspended 
            &dwThreadId);      // returns thread ID          CloseHandle(hThread); GetStartupInfo(&sui); _asm{
int 3;
} for(;;)
{
hThread = CreateThread( 
            NULL,              // no security attribute 
            0,                 // default stack size 
            (LPTHREAD_START_ROUTINE) InstanceThread,     (LPVOID) &sui,
            0,                 // not suspended 
            &dwThreadId);      // returns thread ID          if (hThread == NULL) 
            return 0; WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
}
   
   return 0; 
}
VOID InstanceThread(LPVOID lpvParam) 
{
   BYTE chRequest[INBUFSIZE]; 
   BYTE chReply[OUTBUFSIZE]; 
   DWORD cbBytesRead, cbReplyBytes, cbWritten; 
   BOOL fSuccess, fFirstTime = TRUE; 
   HANDLE hPipe; 
   LPIMAGEINFO lpiminfo; 
   LPBYTE lpRequest = chRequest;
   STARTUPINFO * lpsui = (STARTUPINFO *)lpvParam;   hPipe = lpsui->hStdInput;
   lpiminfo = (LPIMAGEINFO)malloc(sizeof(IMAGEINFO));
   lpiminfo->lpCushion = (LPBYTE)malloc(BUFSIZE);
   lpiminfo->hFile = NULL;
   lpiminfo->lpDocname = NULL;
   lpiminfo->dwCount = 0;
   lpiminfo->dwflag = BEGINDOC;
   lpiminfo->dwLeave = 0;
   lpiminfo->dwUnComplete = 0;
   lpiminfo->rsize = 0;
   lpiminfo->lpHeader = NULL;   debugprint(InstanceThread);   while (1)
   {
   lpRequest = chRequest + lpiminfo->dwLeave;
   // Read client requests from the pipe. 
      fSuccess = ReadFile(
         hPipe,        // handle to pipe 
         lpRequest,    // buffer to receive data 
         INBUFSIZE,      // size of buffer 
         &cbBytesRead, // number of bytes read 
         NULL);        // not overlapped I/O       if (! fSuccess || cbBytesRead == 0)
  {
  if (lpiminfo->hFile != NULL)
  EndSaveToFile( lpiminfo );
  //CloseHandle(lpiminfo->hFile);
break; 
  }
      GetAnswerToRequest(chRequest, 
cbBytesRead, 
chReply, 
&cbReplyBytes, 
lpiminfo); 
  //if (strcmp(chReply,"end")==0) 
  if(chReply[0]=='e')
  {
  if (lpiminfo->hFile != NULL)
  EndSaveToFile( lpiminfo );
  debugprint(chReply);
         break; 
  }

  if( fFirstTime )
  {
  // Write the reply to the pipe. 
  fSuccess = WriteFile( 
  lpsui->hStdOutput,// handle to pipe 
  chReply,      // buffer to write from 
  cbReplyBytes, // number of bytes to write 
  &cbWritten,   // number of bytes written 
  NULL);        // not overlapped I/O 
  
  if (! fSuccess || cbReplyBytes != cbWritten) 
  {
  if (lpiminfo->hFile != NULL)
  CloseHandle(lpiminfo->hFile);
  break; 
  }
  fFirstTime = FALSE;
  }
  }    debugprint(end);   if ( lpiminfo->lpHeader )
free( lpiminfo->lpHeader );
   lpiminfo->lpHeader = NULL;   if ( lpiminfo->lpDocname )
free( lpiminfo->lpDocname );
   lpiminfo->lpDocname = NULL;   if ( lpiminfo->lpCushion )
free( lpiminfo->lpCushion );
   lpiminfo->lpCushion = NULL;   if ( lpiminfo )
free( lpiminfo );
   lpiminfo = NULL;
} (未完待续)

解决方案 »

  1.   

    (接上篇)
    VOID GetAnswerToRequest( LPBYTE lpRequest,                DWORD dwBytesRead, 
           LPBYTE lpReply, 
                      LPDWORD lpdwReplyBytes, 
               LPIMAGEINFO         lpiminfo ) 
    {
    DWORD cbBytes = dwBytesRead + lpiminfo->dwLeave;
    DWORD i = 0, j = lpiminfo->dwCount; 
    BOOL NotOK = TRUE;
    LPSTR lpSrc = ( LPSTR )lpRequest;
    LPSTR lpDest = ( LPSTR )lpiminfo->lpCushion;
    DWORD usize, z;    debugprint(GetAnswerToRequest);
       lpiminfo->dwLeave = 0;//每4k数据清一次零
       if (lpiminfo->lpDocname == NULL)
       {
           lpiminfo->lpDocname = (LPTSTR)malloc( (lstrlen(lpRequest) + 1)*sizeof(TCHAR) );
           lpiminfo->lpDocname = lstrcpy( lpiminfo->lpDocname, lpRequest );
           goto OK_CONTINUE;
       }
       if( lpiminfo->dwUnComplete != 0 )
       {
           if( cbBytes <= lpiminfo->dwUnComplete )
           {
    lpiminfo->dwUnComplete -= cbBytes;
    usize = cbBytes;
    NotOK = FALSE;
           }
           else
           {
    usize = lpiminfo->dwUnComplete;
    lpiminfo->dwUnComplete = 0;
           }
           {
    for(z=0;z<usize;z++)
    {
            lpDest[j]=lpSrc[i];
      j++;
      i++;
    }
    if( lpiminfo->dwUnComplete == 0 )
    j += lpiminfo->dwComplete;
           }
         }
         while( NotOK )
         {
    //if(i==cbBytes)break;
    switch ( lpiminfo->dwflag )
    {
    case BEGINDOC:
    //不够指令长,NotOK=FALSE, 但是确信此处不会出现此情况
    //查找BEGINDOC,查找select resolution,查找select papersize
    //初始化多页存储,继续下一步 *lpdwflag = STARTPAGE_ENDDOC
    {
      DWORD xRes, yRes, Width, Height;
    DWORD resflag, dimflag;
    while(!((lpSrc[i]==0x1B)&&(lpSrc[i+1]==0x73)&&(lpSrc[i+2]==0x70)&&(lpSrc[i+3]==0x73)))//&&(i<=(cbBytes-6)))
    {
        i++;
    }
    if( (cbBytes-i) == 6)
        goto ERROR_END;
    i+=4;
    dimflag = (BYTE)lpSrc[i];
    i++;
    Height = lpSrc[i] + lpSrc[i+1]*256;
    i+=2;
    switch(dimflag)
    {
    case 0x07://A4
    Width = 4962 - 120;
    Height = Height - 120;
    break;
    default:
    goto ERROR_END;
    }
    while(!((lpSrc[i]==0x1B)&&(lpSrc[i+1]==0x73)&&(lpSrc[i+2]==0x72)&&(lpSrc[i+3]==0x65)))//&&(i<=(cbBytes-5)))
    {
       i++;
    }
    if( (cbBytes-i) == 6)
    goto ERROR_END;
    i+=4;
    resflag = lpSrc[i];
    i++;
    switch(resflag)
    {
    case 6:
    xRes = 600;
    yRes = 600;
    break;
    case 3:
    xRes = 300;
    yRes = 300;
    Width = Width/2;
    Height = Height/2;
    break;
             }
    PreSaveToFile( lpiminfo, xRes, yRes, Width, Height ); lpiminfo->dwflag = STARTPAGE_ENDDOC;
           }
           break;
         case STARTPAGE_ENDDOC:
    //不够指令长,NotOK=FALSE
    //找到STARTPAGE,继续下一步 *lpdwflag = YM_REl
    //找到ENDDOC,结束goto OK_END;
            while(!((lpSrc[i]==0x1B)&&(lpSrc[i+1]==0x73)&&(lpSrc[i+2]==0x70)&&(lpSrc[i+3]==0x61))&& \
    (!((lpSrc[i]==0x1B)&&(lpSrc[i+1]==0x65)&&(lpSrc[i+2]==0x64)&&(lpSrc[i+3]==0x6f)))&&(i<=(cbBytes-4)))
    {
       i++;
    }
    if( ((cbBytes-i) <= 4)&& \
    !((lpSrc[i]==0x1B)&&(lpSrc[i+1]==0x73)&&(lpSrc[i+2]==0x70)&&(lpSrc[i+3]==0x61))&& \
    !((lpSrc[i]==0x1B)&&(lpSrc[i+1]==0x65)&&(lpSrc[i+2]==0x64)&&(lpSrc[i+3]==0x6f)))
    {
    lpiminfo->dwLeave = cbBytes-i;
    if( lpiminfo->dwLeave != 0 )
    memcpy( (LPBYTE)lpDest, (LPBYTE)(lpSrc+i), lpiminfo->dwLeave );
    NotOK = FALSE;
    break;
    }
    if(!((lpSrc[i]==0x1B)&&(lpSrc[i+1]==0x73)&&(lpSrc[i+2]==0x70)&&(lpSrc[i+3]==0x61)))
    {
    EndSaveToFile( lpiminfo );
    goto OK_END;
    }
    else
    {
    i+=4;
    PreSaveToPage( lpiminfo );
    j = 0;
    lpiminfo->dwflag = YM_REl_SENDBLOCK;
    }
    break;
         case YM_REl_SENDBLOCK://_ENDPAGE:
    //不够指令长,NotOK=FALSE
    //找到YM_REl,继续下一步 *lpdwflag = SENDBLOCK_ENDPAGE
    while(!((lpSrc[i]==0x1B)&&(lpSrc[i+1]==0x59)&&(lpSrc[i+2]==0x52)&&(lpSrc[i+3]==0x45))&& \
    (!((lpSrc[i]==0x1B)&&(lpSrc[i+1]==0x73)&&(lpSrc[i+2]==0x62)&&(lpSrc[i+3]==0x6c)))&&(i<=(cbBytes-6)))
    {
    i++;
    }
    if( ((cbBytes-i) <= 6)&& \
    !((lpSrc[i]==0x1B)&&(lpSrc[i+1]==0x59)&&(lpSrc[i+2]==0x52)&&(lpSrc[i+3]==0x45))&& \
    !((lpSrc[i]==0x1B)&&(lpSrc[i+1]==0x73)&&(lpSrc[i+2]==0x62)&&(lpSrc[i+3]==0x6c)))
    {
    lpiminfo->dwLeave = cbBytes-i;
    if( lpiminfo->dwLeave != 0 )
    memcpy( (LPBYTE)lpDest, (LPBYTE)(lpSrc+i), lpiminfo->dwLeave );
    NotOK = FALSE;
    break;
    }
    //比较是YM_REl或SENDBLOCK
    if((lpSrc[i]==0x1B)&&(lpSrc[i+1]==0x59)&&(lpSrc[i+2]==0x52)&&(lpSrc[i+3]==0x45))
    {
    i+=4;
    //插空白行
    usize = (BYTE)lpSrc[i] + (BYTE)lpSrc[i+1]*256 i+=2;
    switch(lpiminfo->dwxRes)
    {
    case 600:
    break;
    case 300:
    usize = usize/2;
    break;
    }
    if(usize>=lpiminfo->dwBandHeight)
    {
    lpiminfo->dwDataHeight = lpiminfo->dwBandHeight;
    SaveDataToPage( lpiminfo ); usize = usize - lpiminfo->dwBandHeight;
    while(usize>=lpiminfo->dwBandHeight)
    {
    lpiminfo->dwDataHeight = lpiminfo->dwBandHeight;
    SaveDataToPage( lpiminfo ); usize = usize - lpiminfo->dwBandHeight;
    } } lpiminfo->dwDataHeight += usize; j = usize * lpiminfo->dwDataWidth; lpiminfo->dwflag = SENDBLOCK_ENDPAGE;
           }
          else
          {
    i+=4;
    //添加数据,需要考虑数据不足的情况
    usize = (BYTE)lpSrc[i] + (BYTE)lpSrc[i+1]*256;
    i+=2;
    lpiminfo->dwDataHeight = 1;////////////////
    if(usize<=(cbBytes-i))
    {
    for(z=0;z<usize;z++)
    {
    lpDest[j]=lpSrc[i];
    j++;
    i++;
    }
    j += lpiminfo->dwComplete;////////////
    }
    else
    {
    lpiminfo->dwUnComplete = usize - (cbBytes-i); while((cbBytes-i)!=0)
    {
    lpDest[j]=lpSrc[i];
    j++;
    i++;
    }
             NotOK = FALSE;
    }
    lpiminfo->dwflag = YM_REl_ENDPAGE;
           }
           break;
         case SENDBLOCK_ENDPAGE:
    //不够指令长,或不够数据长,NotOK=FALSE
    //找到SENDBLOCK,继续下一步 *lpdwflag = ENDPAGE_YM_REl
    //找到ENDPAGE,继续下一步 *lpdwflag = STARTPAGE_ENDDOC
    //找到ENDPAGE,如果上一步是YM_REl,还需要补一行空白行
    while(!((lpSrc[i]==0x1B)&&(lpSrc[i+1]==0x73)&&(lpSrc[i+2]==0x62)&&(lpSrc[i+3]==0x6c))&& \
    (!((lpSrc[i]==0x1B)&&(lpSrc[i+1]==0x65)&&(lpSrc[i+2]==0x70)&&(lpSrc[i+3]==0x61)))&&(i<=(cbBytes-6)))
    {
    i++;
    }
    if( ((cbBytes-i) <= 6)&& \
    !((lpSrc[i]==0x1B)&&(lpSrc[i+1]==0x73)&&(lpSrc[i+2]==0x62)&&(lpSrc[i+3]==0x6c))&& \
    !((lpSrc[i]==0x1B)&&(lpSrc[i+1]==0x65)&&(lpSrc[i+2]==0x70)&&(lpSrc[i+3]==0x61)))
    {
            lpiminfo->dwLeave = cbBytes-i;
            if( lpiminfo->dwLeave != 0 )
    memcpy( (LPBYTE)lpDest, (LPBYTE)(lpSrc+i), lpiminfo->dwLeave );
    NotOK = FALSE;
    break;
    }
    //比较是SENDBLOCK或ENDPAGE
    if((lpSrc[i]==0x1B)&&(lpSrc[i+1]==0x73)&&(lpSrc[i+2]==0x62)&&(lpSrc[i+3]==0x6c))
    {
               i+=4;
    //添加数据,需要考虑数据不足的情况
    usize = (BYTE)lpSrc[i] + (BYTE)lpSrc[i+1]*256 i+=2;
    lpiminfo->dwDataHeight++;////////////////////////
    if(usize<=(cbBytes-i))
    {
    for(z=0;z<usize;z++)
    {
    lpDest[j]=lpSrc[i];
    j++;
    i++;
    }
    j += lpiminfo->dwComplete;
    }
    else
    {
    lpiminfo->dwUnComplete = usize - (cbBytes-i); while((cbBytes-i)!=0)
    {
    lpDest[j]=lpSrc[i];
    j++;
    i++;
    }
    NotOK = FALSE;
             }
    lpiminfo->dwflag = YM_REl_ENDPAGE; }
    else
    {
    i+=4;
    EndSaveToPage( lpiminfo );
    lpiminfo->dwflag = STARTPAGE_ENDDOC;
    }
    break;
      

  2.   

    case YM_REl_ENDPAGE:
    //不够指令长,NotOK=FALSE
    //找到YM_REl,继续下一步 *lpdwflag = SENDBLOCK_ENDPAGE
    //找到ENDPAGE,继续下一步 *lpdwflag = STARTPAGE_ENDDOC
    while(!((lpSrc[i]==0x1B)&&(lpSrc[i+1]==0x59)&&(lpSrc[i+2]==0x52)&&(lpSrc[i+3]==0x45))&& \
    (!((lpSrc[i]==0x1B)&&(lpSrc[i+1]==0x65)&&(lpSrc[i+2]==0x70)&&(lpSrc[i+3]==0x61)))&&(i<=(cbBytes-6)))
    {
    i++;
    }
    if( ((cbBytes-i) <= 6)&& \
    !((lpSrc[i]==0x1B)&&(lpSrc[i+1]==0x59)&&(lpSrc[i+2]==0x52)&&(lpSrc[i+3]==0x45))&& \
    !((lpSrc[i]==0x1B)&&(lpSrc[i+1]==0x65)&&(lpSrc[i+2]==0x70)&&(lpSrc[i+3]==0x61)))
    {
    lpiminfo->dwLeave = cbBytes-i;
    if( lpiminfo->dwLeave != 0 )
    memcpy( (LPBYTE)lpDest, (LPBYTE)(lpSrc+i), lpiminfo->dwLeave );
    NotOK = FALSE;
    break;
    }
    //比较是YM_REl或ENDPAGE
    if((lpSrc[i]==0x1B)&&(lpSrc[i+1]==0x59)&&(lpSrc[i+2]==0x52)&&(lpSrc[i+3]==0x45))
    {
    i+=4;
    //如果值大于1,插空白行,(xxxxxxxx或上一次也为YM_RELxxxxxxxxx) usize = (BYTE)lpSrc[i] + (BYTE)lpSrc[i+1]*256 i+=2;
    switch(lpiminfo->dwxRes)
    {
    case 600:
    break;
    case 300:
    usize = usize/2;
    break;
    }
    usize = usize - 1;//求得插空白行的数量 if((usize+lpiminfo->dwDataHeight)>=lpiminfo->dwBandHeight)
    {
    usize = usize + lpiminfo->dwDataHeight;
    lpiminfo->dwDataHeight = lpiminfo->dwBandHeight;
    SaveDataToPage( lpiminfo );
    usize = usize - lpiminfo->dwBandHeight;
    while(usize>=lpiminfo->dwBandHeight)
    {
    lpiminfo->dwDataHeight = lpiminfo->dwBandHeight;                             SaveDataToPage( lpiminfo ); usize = usize - lpiminfo->dwBandHeight;
    }
    j = 0; }
    lpiminfo->dwDataHeight += usize;
    j += usize * lpiminfo->dwDataWidth;
    lpiminfo->dwflag = SENDBLOCK_ENDPAGE; }
    else
    {
    i+=4;
    EndSaveToPage( lpiminfo );
    lpiminfo->dwflag = STARTPAGE_ENDDOC;
    }
    break;
         default:
    goto ERROR_END;
         }
       }       lpiminfo->dwCount = j;
    OK_CONTINUE:
    lpReply[0] = 'o';
    lpReply[1] = 'k';
    lpReply[2] = '\0';
    *lpdwReplyBytes = 3;
    return;
    OK_END:
    lpReply[0] = 'e';
    lpReply[1] = 'n';
    lpReply[2] = 'd';
    lpReply[3] = '\0';
    *lpdwReplyBytes = 4;
    return;
    ERROR_END:
    lpReply[0] = 'e';
    lpReply[1] = 'r';
    lpReply[2] = 'r';
    lpReply[3] = 'o';
    lpReply[4] = 'r';
    lpReply[5] = '\0';
    *lpdwReplyBytes = 6;
    }
      

  3.   

    再加一段
    BOOL PreSaveToFile( LPIMAGEINFO lpiminfo, 
      DWORD xRes, 
      DWORD yRes, 
      DWORD Width,
      DWORD Height )
    {
    lpiminfo->ColorMode = Bilevel; lpiminfo->Compression = CompressG4; lpiminfo->SingleOrMulti = MULTIPAGE; lpiminfo->dwPageIndex = 0; lpiminfo->rsize = 0;

    lpiminfo->dwxRes = xRes; lpiminfo->dwyRes = yRes; lpiminfo->dwWidth = Width; lpiminfo->dwHeight = Height; lpiminfo->dwDataWidth = ((Width+31)/32)*4; lpiminfo->dwComplete = lpiminfo->dwDataWidth - ((Width+7)/8); lpiminfo->dwBandHeight = 65536/lpiminfo->dwDataWidth; lpiminfo->hFile = CreateFile( lpiminfo->lpDocname,
                                GENERIC_READ | GENERIC_WRITE,
                                FILE_SHARE_READ | FILE_SHARE_WRITE,
                                NULL,
                                OPEN_ALWAYS,
                                FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,
                                NULL ); return TRUE;
    }BOOL EndSaveToFile(LPIMAGEINFO lpiminfo)
    {
    SetFilePointer(lpiminfo->hFile, lpiminfo->rsize, NULL, FILE_BEGIN);

    SetEndOfFile(lpiminfo->hFile); CloseHandle(lpiminfo->hFile);

    lpiminfo->hFile = NULL;
      
    return TRUE;
    }BOOL PreSaveToPage(LPIMAGEINFO lpiminfo)
    {
    BOOL ret; ret = PreSaveToTiff(lpiminfo);

    lpiminfo->dwLeave = 0;

    lpiminfo->dwCount = 0; lpiminfo->dwDataHeight = 0; lpiminfo->dwPageHeight = 0; ZeroMemory(lpiminfo->lpCushion, BUFSIZE); //lpiminfo->dwDataWidth  return ret;
    }BOOL SaveDataToPage(LPIMAGEINFO lpiminfo)
    {
    BOOL ret; lpiminfo->dwPageHeight += lpiminfo->dwDataHeight; ret = SaveDataToTiff(lpiminfo); ZeroMemory(lpiminfo->lpCushion, BUFSIZE); lpiminfo->dwCount = 0; lpiminfo->dwDataHeight = 0; return TRUE;
    }BOOL EndSaveToPage( LPIMAGEINFO lpiminfo )
    {
    BOOL ret; while(lpiminfo->dwHeight > 
    (lpiminfo->dwBandHeight + lpiminfo->dwPageHeight))
    {
    lpiminfo->dwDataHeight = lpiminfo->dwBandHeight;
    SaveDataToPage(lpiminfo);
    } lpiminfo->dwDataHeight = lpiminfo->dwHeight - lpiminfo->dwPageHeight;
    if(lpiminfo->dwDataHeight > 0)
    SaveDataToPage(lpiminfo); ret = EndSaveToTiff(lpiminfo); return TRUE;
    }
      

  4.   

    sorry,中午吃个饭,又忙点儿别的事儿,就耽误了此程序的目的是把prn文件转为tiff文件,
    这是其中的一部分,后面是tiff的压缩和存储那部分,
    本来在nt下时没问题的,
    到了win98下不能用命名管道,就用匿名管道了,
    所以就改动了一部分程序,结果就不行了
    错误的症状比较多,有时是缓冲区溢出,有时是在系统dll里出错
      

  5.   

    令人头疼的是这里程序出错,
    spool32进程就跟着完蛋,
    然后就得重启机器,否则就调不了了忘了说了,本程序是由端口监视器启动的,
    它的StdInput、StdOutput已被重定向为两个匿名管道
      

  6.   

    我是用端口监视器捕获打印输出,
    然后利用匿名管道与本程序通信,
    把数据传给本程序prn文件中的打印指令没有矢量绘图指令,因为打印机驱动被我处理了
    里面有用的指令(就是我用来分析数据的)如下:
    1、打印作业开始:sdo (或 0x1b 0x73 0x64 0x6f) 
    2、选择纸张尺寸:sps (或 0x1b 0x73 0x70 0x73) 
    3、选择分辨率:  sre (或 0x1b 0x73 0x72 0x65) 
    4、开始一页:    spa (或 0x1b 0x73 0x70 0x61) 
    5、打印头换行:  YRE (或 0x1b 0x59 0x52 0x45) 
    6、发送数据:    sbl (或 0x1b 0x73 0x62 0x6c) 
    7、结束一页:    epa (或 0x1b 0x65 0x70 0x61) 
    8、打印作业结束:edo (或 0x1b 0x65 0x64 0x6f) 
    0x1b为指令起始符,后面的就是前面字符的ascii码
      

  7.   

    我贴出来的代码是本程序从最外层开始的,按功能可分为四层:第一层WinMain函数,保证在一个时间内只有一个工作线程用于接收数据,也即一份打印作业开一个线程,因为在打印作业结束后,当前工作线程会结束,由主线程开启新的工作线程第二层InstanceThread函数,初始化一部分数据,并使用循环接收从端口监视器来的数据,并调用GetAnswerToRequest函数去处理,其中只有第一次回写数据给端口监视器第三层GetAnswerToRequest函数,用于分析得到的数据,第一次得到的数据是文件名,以后的数据就是真正的prn数据,每次读入4k,生成的数据是位图格式,大小为不超过64k的当前位图格式最大行数的数据量,在PreSaveToFile中执行这步初始化的,新开始一页就调用PreSaveToPage,每当满了最大行数就调用SaveDataToPage,一页结束就调用EndSaveToPage,打印作业结束就调用EndSaveToFile(因为我是用多页tiff文件格式来保存的)第四层是后面贴出的5个函数,用于根据文件名建立文件,并调用dib->tiff的几个函数(没有贴出)来把位图保存为压缩的tiff文件,以及在各种情况下的数据初始化(其实有一部分初始化代码放在这里,不是很合理,但考虑到了代码冗余读起来也费劲),特别注意就是EndSaveToPage中对SaveDataToPage的调用,这是因为win98下通用打印驱动程序对于打印页的底部空白并不会使用“打印头换行:  YRE (或 0x1b 0x59 0x52 0x45) ”这一指令,而是直接一个“7、结束一页:    epa (或 0x1b 0x65 0x70 0x61) ”指令,所以要考虑补足空白各位老大,还有什么看不懂得吗?
    看的懂,就给挑挑毛病出在哪吧!
    我实在是搞的有点儿头破血流了!
      

  8.   

    WinMain中的
    LPTSTR lpszMutexname = "StartHELPsMutex";
    实属失误,为最初做nt下程序时留下来的代码行,
    因为win98下的一些变化,没有再用Mutex,
    但是忘了删掉了这一行
    不必为此误导
      

  9.   

    IMAGEINFO 结构如下:typedef struct _IMAGEINFO {
    LPTSTR lpDocname;
    HANDLE hFile;

             DWORD   rsize; //文件的真实大小

    DWORD dwWidth; //位图宽度
    DWORD dwHeight; //位图高度
    DWORD dwxRes;
    DWORD dwyRes;
    DWORD dwBandHeight;

    WORD dwPageIndex; //页码
    DWORD dwDataWidth; //数据宽度,从sendblock指令中取得
    DWORD dwComplete; //补足位数

    DWORD dwDataHeight;//累加得到数据高度,仅限于一条
    DWORD dwPageHeight;//页面高度,2002/12/27新增,用于累加
    LPBYTE lpCushion;//缓冲数据,用于得到完整的band数据
    DWORD dwCount; //缓冲区内的数据长度(以byte为单位) DWORD dwflag;
    DWORD dwLeave;
    DWORD dwUnComplete;

    LPBYTE lpHeader;
    //LPBYTE  encodestate;

    WORD ColorMode;
    WORD Compression;
    WORD SingleOrMulti;
    } IMAGEINFO , * LPIMAGEINFO;其中有些字段只是为后面的tiff压缩及文件存储而用的,请不必深究