
void __fastcall TMake::AddMemorySizeInfo(void)...{
if(CheckExFile() && (ErrorCount==0) && !SrcCompile && isMake) ...{
char cppdllpath[MAX_PATH+1],setuppath[MAX_PATH+1],mapfilepath[MAX_PATH+1],exfilepath[MAX_PATH+1],appname[FIX_BufSize_M+1];
BuildSocket->DFSendMessage(MSG_GetApplicationName, NULL, appname, FIX_BufSize_M);
if(GetSetupDirectory(appname, cppdllpath, MAX_PATH)==NULL)...{
return;
}
strcat(cppdllpath,"/bin/");

if(!CheckExFile(exfilepath))...{
return;
}
BuildSocket->GetMapFile(mapfilepath, MAX_PATH);
if(mapfilepath == NULL || mapfilepath[0] == 0 )...{
return;
}
if( FileExists(AnsiString(cppdllpath)+MAPANA3SNAME) && CheckTimeExWithMapFile(mapfilepath,exfilepath) )...{
AnsiString tst="";
// •W€o—Í—pƒpƒCƒv
HANDLE hReadPipe = NULL, hWritePipe = NULL;
// ƒGƒ‰[o—Í—pƒpƒCƒv
HANDLE hErrReadPipe = NULL, hErrWritePipe = NULL;
// ƒZƒLƒ…ƒŠƒeƒB‘®«(ƒnƒ“ƒhƒ‹Œp³‚ðŽw’è)
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
// •W€o—̓pƒCƒv‚Ìì¬
::CreatePipe(&hReadPipe, &hWritePipe, &sa, 8192);
// ƒGƒ‰[o—̓pƒCƒv‚Ìì¬
::CreatePipe(&hErrReadPipe, &hErrWritePipe, &sa, 8192);
STARTUPINFO StartupInfo;
PROCESS_INFORMATION ProcessInfo;
::ZeroMemory(&StartupInfo, sizeof(STARTUPINFO));
StartupInfo.cb = sizeof(STARTUPINFO);
// ƒnƒ“ƒhƒ‹‚ÌŒp³‚ðŽw’è
StartupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
// DOS‘‹‚𕎦‚µ‚È‚¢
StartupInfo.wShowWindow = SW_HIDE;//SW_HIDE;
// •W€o—̓nƒ“ƒhƒ‹‚ƃGƒ‰[o—̓nƒ“ƒhƒ‹‚ðÝ’è
StartupInfo.hStdOutput = hWritePipe;
StartupInfo.hStdError = hErrWritePipe;
AnsiString str="";
str = str + """ + mapfilepath + """;
str.Insert(AnsiString(cppdllpath)+MAPANA3SNAME+" ",0);
// ƒRƒ“ƒ[ƒ‹ƒAƒvƒŠ‹N“®
if (::CreateProcess(
NULL,
str.c_str(),
&sa,
NULL,
TRUE, // ƒnƒ“ƒhƒ‹‚ÌŒp³
0,//DETACHED_PROCESS, // DOS‘‹‚𕎦‚µ‚È‚¢‚½‚߂̎w’è
NULL,
NULL,
&StartupInfo, &ProcessInfo))
...{
// ƒpƒCƒv“à—eŽó‚¯Žæ‚è—pƒoƒbƒtƒ@
char bufStdOut[8192], bufErrOut[8192];
DWORD dwStdOut = 0, dwErrOut = 0;
DWORD dwRet;
// ƒvƒƒZƒX‹N“®’†‚̃pƒCƒv“à—eŽó‚¯Žæ‚舗
while ( (dwRet = ::WaitForSingleObject(ProcessInfo.hProcess, 0)) !=
WAIT_ABANDONED)
...{
memset(bufStdOut, 0, sizeof(bufStdOut));
memset(bufErrOut, 0, sizeof(bufErrOut));
// •W€o—̓pƒCƒv‚Ì“à—e‚𒲂ׂé
::PeekNamedPipe(hReadPipe, NULL, 0, NULL, &dwStdOut, NULL);
if (dwStdOut > 0)...{
// “à—e‚ª‘¶Ý‚·‚ê‚ÎA“ǂݎæ‚é
::ReadFile(hReadPipe, bufStdOut, sizeof(bufStdOut) - 1, &dwStdOut,
NULL);
// result_list->Add(bufStdOut);
tst += bufStdOut;
// bufStdOut ‚ɃpƒCƒvo—Í‚ª“ü‚é
}
// “¯—l‚ɃGƒ‰[o—͂̈—
::PeekNamedPipe(hErrReadPipe, NULL, 0, NULL, &dwErrOut, NULL);
if (dwErrOut > 0)...{
::ReadFile(hErrReadPipe, bufErrOut, sizeof(bufErrOut) - 1, &dwErrOut,
NULL);
//result_list->Add(bufErrOut);
tst += bufErrOut;
// bufErrOut ‚ɃGƒ‰[o—Í‚ª“ü‚é
}
// ƒƒbƒZ[ƒWƒLƒ…[‚ðŽæ“¾‚µA‘¶Ý‚·‚ê‚ÎAˆ—‚𑣂·
MSG msg;
if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))...{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
// ƒvƒƒZƒXI—¹‚È‚çAƒ‹[ƒv‚𔲂¯‚é
if (dwRet == WAIT_OBJECT_0)
break;
}
// ƒvƒƒZƒXƒnƒ“ƒhƒ‹‚ƃXƒŒƒbƒhƒnƒ“ƒhƒ‹‚ð•‚¶‚é
DWORD res;
::GetExitCodeProcess(ProcessInfo.hProcess, &res);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
}
// ‚·‚ׂẴpƒCƒv‚ð•‚¶‚é
::CloseHandle(hWritePipe);
::CloseHandle(hReadPipe);
::CloseHandle(hErrWritePipe);
::CloseHandle(hErrReadPipe);
tst.Insert("0,",0);
BuildSocket->DFSendMessage(MSG_AddBuildMessage, tst.c_str());
}
}
isMake=false;
}
先贴上代码 心得以后再加。
本文介绍了一种使用C++程序进行内存分析的方法,通过创建管道、启动子进程并读取其输出来获取内存使用信息。
902

被折叠的 条评论
为什么被折叠?



