📄 util.cpp
字号:
#include "stdafx.h"
#include "util.h"
CHAR chBuf[1024];
DWORD CALLBACK ReadStreamCallback(DWORD_PTR dwCookie,LPBYTE pbBuff,LONG cb,LONG *pcb){
ReadFile((HANDLE)dwCookie,pbBuff,cb,(LPDWORD)pcb,NULL);
return 0;
}
DWORD CALLBACK WriteStreamCallback(DWORD_PTR dwCookie,LPBYTE pbBuff,LONG cb,LONG *pcb){
WriteFile((HANDLE)dwCookie,pbBuff,cb,(LPDWORD)pcb,NULL);
return 0;
}
//在编辑区的rich edit里面打开文件
VOID open(CString filename,HWND hwnd){
EDITSTREAM stES;
HANDLE hFile = CreateFile(filename,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
stES.dwCookie=(DWORD)hFile;
stES.dwError=NULL;
stES.pfnCallback=(EDITSTREAMCALLBACK)ReadStreamCallback;
SendMessage(hwnd,EM_STREAMIN,SF_TEXT,(LPARAM)&stES);
SendMessage(hwnd,EM_SETMODIFY,FALSE,0);
CloseHandle(hFile);
}
//保存在编辑区中rich edit中的文件
VOID save(CString filename,HWND hwnd){
EDITSTREAM stES;
HANDLE hFile = CreateFile(filename,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
SetFilePointer(hFile,0,0,FILE_BEGIN);
SetEndOfFile(hFile);
stES.dwCookie=(DWORD)hFile;
stES.dwError=NULL;
stES.pfnCallback=(EDITSTREAMCALLBACK)WriteStreamCallback;
SendMessage(hwnd,EM_STREAMOUT,SF_TEXT,(LPARAM)&stES);
SendMessage(hwnd,EM_SETMODIFY,FALSE,0);
CloseHandle(hFile);
}
VOID scanFile(CString path,HWND output){
int m;
//结束字符串,读到此字符串就表示词法分析结束
char END[] = "EOF\n";
char c[100];
int k;
//管道的读写句柄
HANDLE hChildStdinRd, hChildStdinWr,
hChildStdoutRd, hChildStdoutWr;
SECURITY_ATTRIBUTES saAttr;
BOOL fSuccess;
//命令行参数
WCHAR szCmdline[255];
PROCESS_INFORMATION piProcInfo;
STARTUPINFO siStartInfo;
BOOL bFuncRetn = FALSE;
DWORD dwRead, dwWritten;
//缓冲区
//CHAR chBuf[1024];
//临时变量,保存读的字符串
CHAR *temp;
SETTEXTEX se;
//初始化命令行数组的内存
ZeroMemory(szCmdline,sizeof(szCmdline));
//设置命令行
wcscat(szCmdline,TEXT("cmmc.exe "));
wcscat(szCmdline,TEXT("\""));
wcscat(szCmdline,path);
wcscat(szCmdline,TEXT("\""));
wcscat(szCmdline,TEXT(" 1"));
se.codepage=CP_ACP;
se.flags=ST_KEEPUNDO|ST_SELECTION;
// 设置继承标志
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
// 为子进程的标准输出创建管道
if (! CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &saAttr, 0)) ;
SetHandleInformation( hChildStdoutRd, HANDLE_FLAG_INHERIT, 0);
// 为子进程的标准输入创建管道
if (! CreatePipe(&hChildStdinRd, &hChildStdinWr, &saAttr, 0)) ;
SetHandleInformation( hChildStdinWr, HANDLE_FLAG_INHERIT, 0);
//初始化内存
ZeroMemory( &piProcInfo, sizeof(PROCESS_INFORMATION) );
// 初始化 STARTUPINFO 结构.
ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) );
siStartInfo.cb = sizeof(STARTUPINFO);
siStartInfo.hStdError = hChildStdoutWr;
siStartInfo.hStdOutput = hChildStdoutWr;
siStartInfo.hStdInput = hChildStdinRd;
siStartInfo.dwFlags |= STARTF_USESTDHANDLES;
// 创建子进程
CreateProcess(NULL,
szCmdline, // command line
NULL, // process security attributes
NULL, // primary thread security attributes
TRUE, // handles are inherited
0, // creation flags
NULL, // use parent's environment
NULL, // use parent's current directory
&siStartInfo, // STARTUPINFO pointer
&piProcInfo); // receives PROCESS_INFORMATION
//关闭句柄
CloseHandle(piProcInfo.hProcess);
CloseHandle(piProcInfo.hThread);
//循环读取子进程的输出,
//每读取一个输出,就返回一个值给子进程
//读到EOF的时候结束
CloseHandle(hChildStdoutWr);
while(true)
{
ZeroMemory(chBuf,strlen(chBuf));
//从管道中读取文件
bool bResult = ReadFile( hChildStdoutRd, chBuf, 1024, &dwRead, NULL);
//在读取结果末尾添加换行符
chBuf[dwRead-1]='\n';
//在读取结果末尾添加结束符
chBuf[dwRead]='\0';
//分配内存,用来保存读取结果
temp=(char*)malloc(dwRead+1);
//把读取结果放到局部变量中
strcpy(temp,chBuf);
//发送EM_SETTEXTEX消息,让richedit添加文本
SendMessage(output,EM_SETTEXTEX,(WPARAM)&se,(LPARAM)temp);
//发送一个消息给管道,表明以读取了管道中的上一条信息
//if (!WriteFile(hChildStdinWr, chBuf, dwRead, &dwWritten, NULL))
//ErrorCode = GetLastError();
//break;
//判断是否读取结束
if (!bResult||dwRead==0)
{
break;
}
//释放内存
free(temp);
}
}
string parseFile(CString path,bool& succeed){
int m;
//结束字符串,读到此字符串就表示词法分析结束
char END[] = "EOF\n";
char c[100];
int k;
//管道的读写句柄
HANDLE hChildStdinRd, hChildStdinWr,
hChildStdoutRd, hChildStdoutWr;
SECURITY_ATTRIBUTES saAttr;
BOOL fSuccess;
//命令行参数
WCHAR szCmdline[255];
PROCESS_INFORMATION piProcInfo;
STARTUPINFO siStartInfo;
BOOL bFuncRetn = FALSE;
DWORD dwRead, dwWritten;
//缓冲区
//临时变量,保存读的字符串
CHAR *temp;
SETTEXTEX se;
//初始化命令行数组的内存
ZeroMemory(szCmdline,sizeof(szCmdline));
//设置命令行
wcscat(szCmdline,TEXT("cmmc.exe "));
wcscat(szCmdline,TEXT("\""));
wcscat(szCmdline,path);
wcscat(szCmdline,TEXT("\""));
wcscat(szCmdline,TEXT(" 2"));
se.codepage=CP_ACP;
se.flags=ST_KEEPUNDO|ST_SELECTION;
// 设置继承标志
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
// 为子进程的标准输出创建管道
if (! CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &saAttr, 0)) ;
SetHandleInformation( hChildStdoutRd, HANDLE_FLAG_INHERIT, 0);
// 为子进程的标准输入创建管道
if (! CreatePipe(&hChildStdinRd, &hChildStdinWr, &saAttr, 0)) ;
SetHandleInformation( hChildStdinWr, HANDLE_FLAG_INHERIT, 0);
//初始化内存
ZeroMemory( &piProcInfo, sizeof(PROCESS_INFORMATION) );
// 初始化 STARTUPINFO 结构.
ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) );
siStartInfo.cb = sizeof(STARTUPINFO);
siStartInfo.hStdError = hChildStdoutWr;
siStartInfo.hStdOutput = hChildStdoutWr;
siStartInfo.hStdInput = hChildStdinRd;
siStartInfo.dwFlags |= STARTF_USESTDHANDLES;
// 创建子进程
CreateProcess(NULL,
szCmdline, // command line
NULL, // process security attributes
NULL, // primary thread security attributes
TRUE, // handles are inherited
0, // creation flags
NULL, // use parent's environment
NULL, // use parent's current directory
&siStartInfo, // STARTUPINFO pointer
&piProcInfo); // receives PROCESS_INFORMATION
//关闭句柄
CloseHandle(piProcInfo.hProcess);
CloseHandle(piProcInfo.hThread);
string s = "";
ReadFile( hChildStdoutRd, chBuf, 1024, &dwRead, NULL);
WriteFile(hChildStdinWr, chBuf, dwRead, &dwWritten, NULL);
CloseHandle(hChildStdoutWr);
if (chBuf[0]=='T')
{
//语法分析成功
succeed = true;
}
else if(chBuf[0]=='F'){
//分析错误
succeed = false;
}
else{
//词法有错误
succeed = false;
}
while (true)
{
char* buff;
ZeroMemory(chBuf,strlen(chBuf));
bool bResult = ReadFile( hChildStdoutRd, chBuf, 1024, &dwRead, NULL);
int index = s.find_first_of(-52);
s = s.substr(0,index);
s.append(chBuf);
if (!bResult||dwRead==0)
{
break;
}
}
int index = s.find_first_of(-52);
s = s.substr(0,index);
return s;
}
VOID execFile(CString path,bool &success){
bool can_exec = true;
parseFile(path,can_exec);
if(can_exec){
success = true;
SECURITY_ATTRIBUTES saAttr;
BOOL fSuccess;
//命令行参数
WCHAR szCmdline[255];
PROCESS_INFORMATION piProcInfo;
STARTUPINFO siStartInfo;
BOOL bFuncRetn = FALSE;
DWORD dwRead, dwWritten;
//缓冲区
//CHAR chBuf[1024];
//临时变量,保存读的字符串
CHAR *temp;
SETTEXTEX se;
//初始化命令行数组的内存
ZeroMemory(szCmdline,sizeof(szCmdline));
//设置命令行
wcscat(szCmdline,TEXT("interpreter.exe "));
wcscat(szCmdline,TEXT("\""));
wcscat(szCmdline,path);
wcscat(szCmdline,TEXT(".cmmo"));
wcscat(szCmdline,TEXT("\""));
se.codepage=CP_ACP;
se.flags=ST_KEEPUNDO|ST_SELECTION;
// 设置继承标志
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
//初始化内存
ZeroMemory( &piProcInfo, sizeof(PROCESS_INFORMATION) );
// 初始化 STARTUPINFO 结构.
ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) );
siStartInfo.cb = sizeof(STARTUPINFO);
//siStartInfo.dwFlags = STARTF_USESTDHANDLES;
//siStartInfo.wShowWindow = SW_SHOWNORMAL;
// 创建子进程
CreateProcess(NULL,
szCmdline, // command line
NULL, // process security attributes
NULL, // primary thread security attributes
false, // handles are inherited
0, // creation flags
NULL, // use parent's environment
NULL, // use parent's current directory
&siStartInfo, // STARTUPINFO pointer
&piProcInfo); // receives PROCESS_INFORMATION
}
else{
success = false;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -