고수닷넷 - 데미소다오렌지님
종종 dos 커맨드를 사용하기 위해서 system 함수를 쓸 일이 있습니다. 하지만 system 함수를 사용하게 되면 command 창이 떠서 해당 결과를 출력해 버립니다. 결과가 없는 경우라 하더라고 command 창이 떴다 사라지기 때문에 이상하게 보일 수 있습니다.
이럴때, command 출력을 리디렉션 시키는 방법을 사용하면 손쉽게 문제를 해결 할 수 있습니다. 아래 함수가 그러한 역할을 합니다. lpszCmd로 전송된 커맨드를 실행시키고, lpszBuffer에 결과를 담아줍니다.
BOOL CmdRun(LPSTR lpszCmd, LPSTR *lpszBuffer)
{
PROCESS_INFORMATION pi;
STARTUPINFO si;
BOOL bCreated = FALSE;
SECURITY_ATTRIBUTES sa;
memset(&pi, 0, sizeof(PROCESS_INFORMATION));
memset(&si, 0, sizeof(STARTUPINFO));
memset(&sa, 0, sizeof(SECURITY_ATTRIBUTES));
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
char szCmdOut[255];
sprintf(szCmdOut, "c:\\cmd%ld_out.txt", GetCurrentThreadId());
HANDLE hFile = CreateFile(szCmdOut, GENERIC_WRITE, 0, &sa, CREATE_ALWAYS ,
FILE_ATTRIBUTE_NORMAL, NULL);
if( hFile == INVALID_HANDLE_VALUE )
{
printf("CreateFile cmd_out.txt failed\n");
return FALSE;
}
char szCmd[255];
sprintf(szCmd, "c:\\cmd%ld.cmd", GetCurrentThreadId());
HANDLE hCmdFile = CreateFile(szCmd, GENERIC_WRITE, 0, &sa, CREATE_ALWAYS ,
FILE_ATTRIBUTE_NORMAL, NULL);
if( hCmdFile == INVALID_HANDLE_VALUE )
{
printf("CreateFile cmd.cmd failed\n");
return FALSE;
}
DWORD dwSize = 0;
WriteFile(hCmdFile, lpszCmd,strlen(lpszCmd), &dwSize,NULL);
CloseHandle(hCmdFile);
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdOutput = hFile;
si.hStdInput = hFile;
si.hStdError = hFile;
bCreated = CreateProcess(NULL, szCmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
if( bCreated==FALSE )
{
printf("CreateProcess failed\n");
return FALSE;
}
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
CloseHandle(hFile);
HANDLE hReadCmdFile = CreateFile(szCmdOut, GENERIC_READ, 0, &sa,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
dwSize=GetFileSize(hReadCmdFile,NULL);
*lpszBuffer = new char[dwSize];
memset(*lpszBuffer, 0, dwSize);
DWORD dwRead = 0;
ReadFile(hReadCmdFile,*lpszBuffer,dwSize,&dwRead,NULL);
*(*lpszBuffer+dwRead) = 0;
CloseHandle(hReadCmdFile);
DeleteFile(szCmd);
DeleteFile(szCmdOut);
return TRUE;
}
아래와 같이 사용하면 됩니다.
TCHAR *buffer;
CmdRun("dir", &buffer);
printf("%s", buffer);
delete [] buffer;
CmdRun("ping 168.126.63.1", &buffer);
printf("%s", buffer);
delete [] buffer;
"Win32 API" 카테고리의 다른 글
- PE 포맷 분석2 (0)2007/01/02
- PE 포맷 분석1 (0)2007/01/02
- command 출력 리디렉션 시키기. (0)2006/12/29
- 실행시 메모리 점유율 줄이기. (0)2006/12/29
- 시스템 트레이 사용하기 (0)2006/12/29

수안이의 컴퓨터 연구실



Leave your greetings.