📄 wfun.cpp
字号:
#include "stdafx.h"
#include <stdio.h>
#include <math.h>
#include "wfun.h"
//////////////////////////////////////////////////////////////////////
// CMapFile Class
//////////////////////////////////////////////////////////////////////
/* 文件映射对象
数据元素
LPVOID lpD; 指向内存映射地址。NULL
HANDLE hFile; 指向文件句柄。NULL
HANDLE hMap; 指向文件映射句柄。NULL
DWORD flP; 文件保护参数。
DWORD hdSize; 文件尺寸。0
DWORD mpBG; 映射文件起始字节。
DWORD mpSize; 映射文件尺寸。0
CString mpName;文件映射名。“”
CString fileName;文件名。“”
类方法
CMapFile();
功能: 构造类对象,置数据元素的初值。
virtual ~CMapFile();
功能: 调用Close()关闭文件映射对象和文件。析构类对象。
HANDLE CreateFileMap(LPCTSTR lpFileName,DWORD flProtect,DWORD dwMaximumSize,LPCTSTR lpMapFileName);
功能: 创建文件映射。此函数必需调用,以使类对象与被映射的文件关联。
参数:
LPCTSTR lpFileName 指向映射文件的文件名。
DWORD flProtect 指向文件保护控制,
PAGE_READWRITE 可读写出、PAGE_READONLY 只读。
DWORD dwMaximumSize 最大文件尺寸。文件需创建时,此值决定文件大小。打开文件时,
此值为 0 则取文件当前大小。
LPCTSTR lpMapFileName 指向文件映射名。此映射名可提供别的进程用
OpenFileMapping共享该映射文件。
返回:成功时返回映射文件句柄。否则为NULL。
HANDLE OpenFileMap( DWORD dwDesiredAccess, BOOL bInheritHandle,LPCTSTR lpName );
功能: 打开已存在的映射文件句柄。
参数:
DWORD dwDesiredAccess 文件访问方式。
BOOL bInheritHandle
LPCTSTR lpName 指向文件映射名。
返回:成功时返回映射文件句柄。否则为NULL。
LPVOID MapOfFile(DWORD dwFileOffset,DWORD dwNumberOfBytesToMap);
功能: 获得映射文件的内存地址。
参数:
DWORD dwFileOffset 文件的起始字节。
DWORD dwNumberOfBytesToMap 被子映射的字节数。
返回:成功时返回映射文件内存地址。否则为NULL。
LPVOID ChangMapOfFile(DWORD dwFileOffset,DWORD dwNumberOfBytesToMap);
功能: 改变文件映射区域。如果映射区域在文件尺寸之外,重新创建文件映射。
参数:
DWORD dwFileOffset 文件的起始字节。
DWORD dwNumberOfBytesToMap 被子映射的字节数。
返回:成功时返回映射文件内存地址。否则为NULL。
void Close();
功能: 关闭文件映射对象。关闭文件句柄。
void CloseMap();
功能: 关闭文件映射。关闭映射句柄。
void CloseMapView();
功能: 关闭映射。释放地址空间。
*/
CMapFile::CMapFile()
{
lpD=NULL;
hMap=NULL;
hFile=NULL;
hdSize=0;
mpSize=0;
mpName=_T("");
fileName=_T("");
}
CMapFile::~CMapFile()
{
Close();
}
HANDLE CMapFile::CreateFileMap(LPCTSTR lpFileName,DWORD flProtect,DWORD dwMaximumSize,LPCTSTR lpMapFileName,DWORD dwCreationDisposition)
{
if(lpFileName==NULL)return(NULL);
unsigned int TheFileLength;
unsigned long uStyle;
if(flProtect&PAGE_READWRITE)uStyle=GENERIC_WRITE|GENERIC_READ;
else if(flProtect&PAGE_READONLY)uStyle=GENERIC_READ;
SECURITY_ATTRIBUTES Security;
Security.lpSecurityDescriptor=NULL;
Security.bInheritHandle=TRUE;
Security.nLength=sizeof(SECURITY_ATTRIBUTES);
if((hFile=CreateFile(lpFileName,uStyle,FILE_SHARE_WRITE|FILE_SHARE_READ,&Security,dwCreationDisposition,FILE_ATTRIBUTE_NORMAL,NULL))==INVALID_HANDLE_VALUE)
{
return(NULL);
}
TheFileLength=GetFileSize(hFile,0);
hMap=NULL;
hMap=CreateFileMapping(hFile,NULL,flProtect,0,dwMaximumSize,lpMapFileName);
if (hMap == NULL)
{
DWORD err=GetLastError();
{
if(err==ERROR_ALREADY_EXISTS)
{
return hMap;
}
else if(err==ERROR_INVALID_HANDLE)
{
return hMap;
}
else if(err==ERROR_PATH_NOT_FOUND)
{
return hMap;
}
}
}
if (hMap != NULL)
{
flP=flProtect;
if(dwMaximumSize==0&&TheFileLength!=0)hdSize=TheFileLength;
else hdSize=dwMaximumSize;
fileName=lpFileName;
if(lpMapFileName!=NULL)mpName=lpMapFileName;
// SetFileAttributes(lpMapFileName,FILE_ATTRIBUTE_HIDDEN);
}
return hMap;
}
HANDLE CMapFile::OpenFileMap( DWORD dwDesiredAccess, BOOL bInheritHandle,LPCTSTR lpName )
{
hMap=OpenFileMapping( dwDesiredAccess, bInheritHandle, lpName );
if (hMap != NULL)
{
flP=dwDesiredAccess;
if(lpName!=NULL)mpName=lpName;
}
return hMap;
}
LPVOID CMapFile::MapOfFile(DWORD dwFileOffset,DWORD dwNumberOfBytesToMap)
{
if(hMap==NULL)return NULL;
DWORD dwDesiredAccess;
if(flP&PAGE_READWRITE)dwDesiredAccess=FILE_MAP_WRITE;
else dwDesiredAccess=FILE_MAP_READ;
if((dwFileOffset+dwNumberOfBytesToMap)>hdSize)
{
if(dwFileOffset>=hdSize)return NULL;
else dwNumberOfBytesToMap=hdSize-dwFileOffset;
}
lpD=MapViewOfFile(hMap,dwDesiredAccess,0,dwFileOffset,dwNumberOfBytesToMap);
if(lpD!=NULL)
{
mpBG=dwFileOffset;
mpSize=dwNumberOfBytesToMap;
}
return lpD;
}
LPVOID CMapFile::ChangMapOfFile(DWORD dwFileOffset,DWORD dwNumberOfBytesToMap)
{
if(UnmapViewOfFile(lpD)==TRUE)
{
mpBG=0;
mpSize=0;
if((dwFileOffset+dwNumberOfBytesToMap)<=hdSize)return MapOfFile(dwFileOffset,dwNumberOfBytesToMap);
else
{
if(hMap!=NULL)CloseHandle(hMap);
hMap=CreateFileMapping(hFile,NULL,flP,0,dwFileOffset+dwNumberOfBytesToMap,mpName);
if (hMap != NULL && GetLastError() == ERROR_ALREADY_EXISTS)
{
CloseHandle(hMap);
CloseHandle(hFile);
hMap=NULL;
hMap=CreateFileMap((LPCTSTR)fileName,flP,dwFileOffset+dwNumberOfBytesToMap,mpName);
if (hMap == NULL)
{
return NULL;
}
}
if (hMap != NULL)
{
hdSize=dwFileOffset+dwNumberOfBytesToMap;
return MapOfFile(dwFileOffset,dwNumberOfBytesToMap);
}
else return NULL;
}
}
return lpD;
}
void CMapFile::Close(BOOL Allow_Delete)
{
CloseMap();
if(hFile!=NULL)
{
CloseHandle(hFile);
hFile=NULL;
if(Allow_Delete==TRUE)
{
DeleteFile((LPCTSTR)fileName);
}
fileName=_T("");
}
}
void CMapFile::CloseMapView()
{
if(lpD!=NULL){UnmapViewOfFile(lpD);lpD=NULL;mpBG=0;mpSize=0;}
}
void CMapFile::CloseMap()
{
CloseMapView();
if(hMap!=NULL){CloseHandle(hMap);hMap=NULL;hdSize=0;mpName=_T("");}
}
BOOL CMapFile::IsOpen()
{
if(hFile!=NULL)return TRUE;
else return FALSE;
}
BOOL CMapFile::IsMapView()
{
if(lpD!=NULL)return TRUE;
else return FALSE;
}
BOOL CMapFile::IsMap()
{
if(hMap!=NULL)return TRUE;
else return FALSE;
}
LPCTSTR FromPathGetFilename(LPCTSTR lpPath)
{
int i=strlen(lpPath);
for(i--;i>0;i--)
{
if(lpPath[i]=='\\'||lpPath[i]==':'){i++;break;}
}
return lpPath+i;
}
CString FromPathGetMapFilename(LPCTSTR lpPath)
{
CString s;
s=lpPath;
int i=strlen(lpPath);
for(i--;i>0;i--)
{
if(lpPath[i]==':')s.SetAt(i,'$');
if(lpPath[i]=='\\')s.SetAt(i,'#');
}
return s;
}
/* 取文件长度
unsigned int GetFileLength(LPCTSTR filename)
功能:取文件长度,如果文件不存在,长度为 0。
参数:
filename 文件名。
输出:返回文件长度。
*/
unsigned int GetFileLength(LPCTSTR filename)
{
CFile f;
unsigned int i;
i=0;
if(f.Open(filename,CFile::modeRead)==TRUE)
{
i=f.GetLength();
f.Close();
}
return i;
}
/* 用系统工具浏览文本文件
void DumpAscFile(LPCTSTR filenam)
功能:用记事本或写字板(大于64K)系统工具浏览文本文件。
参数:
filenam 文本文件名。
输出:无。
*/
void DumpAscFile(LPCTSTR filenam)
{
TCHAR filename[256];
GetWindowsDirectory(filename,256);
CString windpath,fnam;
windpath=filename;
fnam=filenam;
CFile f;
int fl;
if(f.Open(filename,CFile::modeRead)==TRUE)
{
fl=f.GetLength();
f.Close();
}
else fl=0;
if(fl>=0x10000)windpath+=_T("\\WORDPAD ");
else windpath+=_T("\\NOTEPAD ");
windpath+=fnam;
WinExec( (LPCTSTR)windpath,SW_SHOWNORMAL);
}
void OutCString(CString &str,LPCTSTR filenam)
{
TCHAR WinDir[256];
CString s;
if(filenam==NULL)
{
GetWindowsDirectory(WinDir,255);
strcpy(WinDir+strlen(WinDir),_T("\\temp\\outstring.txt"));
s=WinDir;
}
else s=filenam;
CFile f;
f.Open((LPCTSTR)s,CFile::modeCreate|CFile::modeWrite);
f.Write((LPCTSTR)str,str.GetLength()+1);
f.Close();
DumpAscFile((LPCTSTR)s);
}
//
BOOL GetNextWord(LPCTSTR str,LPSTR word,int *pos,int mode,int maxnum)
{
unsigned char css[256],c;
int i,j,k;
if((k=strlen(str))==0)return FALSE;
for(c=0;c<128;c++)
{
css[c+128]=0;css[c]=0;
if(c>='0'&&c<='9')css[c]=1;
if(mode>=1&&((c>='A'&&c<='F')||(c>='a'&&c<='f')))css[c]=1;
if(mode>=2&&((c>='A'&&c<='Z')||(c>='a'&&c<='z')))css[c]=1;
}
for(i=*pos;css[str[i]]==0&&i<k;i++);if(i>=k)return FALSE;
for(j=i;i<k&&css[str[i]]!=0;i++);
if((i-j)>=maxnum)return FALSE;
strncpy(word,str+j,i-j);
word[i-j]='\0';
*pos=i;
return TRUE;
}
CString GetNextLine(LPCTSTR str,int *pos)
{
CString s;
s.Empty();
TCHAR asc[4096];
for(int i=*pos,j=0;i<4095&&str[i]!='\0';i++)
{
if(str[i]=='\n')
{
strncpy(asc,str+*pos,i-*pos);asc[i-*pos]='\0';s=asc;
if(str[i+1]=='\r')i++;
*pos=i+1;break;
}
else if(str[i]=='\r')
{
strncpy(asc,str+*pos,i-*pos);asc[i-*pos]='\0';s=asc;
if(str[i+1]=='\n')i++;
*pos=i+1;break;
}
}
if(i<4095&&str[i]!='\0')return s;
else
{
strncpy(asc,str+*pos,i-*pos);asc[i-*pos]='\0';s=asc;
return s;
}
}
int GetStringLineNumbers(LPCTSTR str,int *LineMaxLength)
{
int Maxl=0,Max=0;
for(int i=0,j=0;i<100000000&&str[i]!='\0';i++,Max++)
{
if(str[i]=='\n')
{
j++;if(Max>Maxl)Maxl=Max;Max=0;
if(str[i+1]=='\r')i++;
}
else if(str[i]=='\r')
{
j++;if(Max>Maxl)Maxl=Max;Max=0;
if(str[i+1]=='\n')i++;
}
}
if(LineMaxLength!=NULL)*LineMaxLength=(Max>Maxl)?Max:Maxl;
if(i==0)return 0;
else if(str[i-1]!='\n'&&str[i]!='\r'){j++;return j;}
else return j;
}
void InitLogFontStruct(LPLOGFONT plf,int lheight)
{
plf->lfHeight = -lheight ;
plf->lfWidth = 0 ;
plf->lfEscapement = 0 ;
plf->lfOrientation = 0 ;
plf->lfWeight = 400 ;
plf->lfItalic = FALSE ;
plf->lfUnderline = FALSE ;
plf->lfStrikeOut = FALSE ;
plf->lfCharSet = 134;//ANSI_CHARSET ;
plf->lfOutPrecision = 3;//OUT_DEFAULT_PRECIS ;
plf->lfClipPrecision =2;// CLIP_DEFAULT_PRECIS ;
plf->lfQuality = 1;//DEFAULT_QUALITY ;
plf->lfPitchAndFamily = 2;//DEFAULT_PITCH | FF_DONTCARE ;
lstrcpy(plf->lfFaceName,_T("")) ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -