下面我把各个函数贴出来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;
} (未完待续)
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;
} (未完待续)
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;
//不够指令长,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;
}
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;
}
这是其中的一部分,后面是tiff的压缩和存储那部分,
本来在nt下时没问题的,
到了win98下不能用命名管道,就用匿名管道了,
所以就改动了一部分程序,结果就不行了
错误的症状比较多,有时是缓冲区溢出,有时是在系统dll里出错
spool32进程就跟着完蛋,
然后就得重启机器,否则就调不了了忘了说了,本程序是由端口监视器启动的,
它的StdInput、StdOutput已被重定向为两个匿名管道
然后利用匿名管道与本程序通信,
把数据传给本程序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码
看的懂,就给挑挑毛病出在哪吧!
我实在是搞的有点儿头破血流了!
LPTSTR lpszMutexname = "StartHELPsMutex";
实属失误,为最初做nt下程序时留下来的代码行,
因为win98下的一些变化,没有再用Mutex,
但是忘了删掉了这一行
不必为此误导
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压缩及文件存储而用的,请不必深究