Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Ruby/2011년스터디/서지혜: Difference between revisions

From ZeroWiki
imported>rabierre
No edit summary
(Repair batch-0003 pages from live compare)
 
(4 intermediate revisions by 2 users not shown)
Line 1: Line 1:
[[pagelist(^Ruby/2011년스터디)]]
<!-- MONIWIKI PageList(^Ruby/2011년스터디) -->
* [[Ruby/2011년스터디]]
* [[Ruby/2011년스터디/강성현]]
* [[Ruby/2011년스터디/김수경]]
* [[Ruby/2011년스터디/루비]]
* [[Ruby/2011년스터디/서지혜]]
* [[Ruby/2011년스터디/세미나]]
__TOC__


== 프로젝트 ==
== 프로젝트 ==
Line 37: Line 44:
=== 2월 21일 ===
=== 2월 21일 ===
* 윈도우 API 테스트
* 윈도우 API 테스트
** windows API로 프로세스의 정보 받아오기
** windows API로 프로세스의 정보 받아오기 ([http://sosal.tistory.com/100 원본])
~cpp
  #include &lt;stdio.h&gt;
  #include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;stdlib.h&gt;
Line 46: Line 54:
  void killProcess(TCHAR*);
  void killProcess(TCHAR*);
   
   
  int _tmain(int argc, TCHAR *argv[]){
  int _tmain(int argc, TCHAR *argv&#91;&#93;){
  // snap every current process  
  // snap every current process  
  HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Line 66: Line 74:
  }
  }
   
   
  _tprintf(_T("\t[Process name]\t[PID]\t[ThreadID]\t[PPID]\n"));
  _tprintf(_T("\t&#91;Process name&#93;\t&#91;PID&#93;\t&#91;ThreadID&#93;\t&#91;PPID&#93;\n"));
  int countProcess=0;
  int countProcess=0;
  do{
  do{
Line 77: Line 85:
  return 0;
  return 0;
  }
  }
** 특정 프로세스 죽이기
** 특정 프로세스 죽이기 ([http://sosal.tistory.com/entry/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EC%B6%9C%EB%A0%A5-%EA%B0%95%EC%A0%9C-%EC%A2%85%EB%A3%8C-%EC%86%8C%EC%8A%A4 원본])
~cpp
  #include &lt;stdio.h&gt;
  #include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;stdlib.h&gt;
Line 86: Line 95:
  void killProcess(TCHAR*);
  void killProcess(TCHAR*);
   
   
  int _tmain(int argc, TCHAR *argv[]){
  int _tmain(int argc, TCHAR *argv&#91;&#93;){
  // kill process
  // kill process
  TCHAR *targetProcess = _T("NateOnMain.exe"); // 종료하려는 프로세스의 이름을 쓴다
  TCHAR *targetProcess = _T("NateOnMain.exe"); // 종료하려는 프로세스의 이름을 쓴다
Line 118: Line 127:
  CloseHandle(hProcessSnap);
  CloseHandle(hProcessSnap);
  }
  }

Latest revision as of 00:29, 27 March 2026

프로젝트

  • 일정 시간이 지나면 웹 브라우저를 종료하는 프로그램 만들기
  • 0207 : 프로그램 명세. 엔포지에 프로젝트 생성(엔포지 링크)

프로그램 기능

  • OS에게 현재 실행중인 웹 브라우저의 정보(총 실행 시간, 현재 뷰중인 페이지)를 얻어 일정시간이상 실행된 (틍정 사이트를 뷰 중인) 웹 브라우저 종료시키기

실행 순서

  • OS에게 웹 브라우저의 정보 얻음
  • 일정시간 이상 실행된 웹 브라우저 검색 (혹은 직접 카운트)
  • 특정 사이트를 뷰중인지 검색
  • 해당 브라우저에게 종료 메세지 보냄 (혹은 경고창을 띄움)

예상 예외사항

  • 웹 브라우저의 정보를 얻을 수 없을 때
    • 실행중인 웹 브라우저가 없을 때
    • 프로세서간 통신 실패시
  • 웹 브라우저가 종료되지 않을 때
    • 잘못된 웹 브라우저의 종료

제약사항

  • 프로세스간의 통신
    • 루비에서의 윈도우API사용

예상 문제점

  • 루비와 윈도우API의 호환성
  • 윈도우API 사용법 습득

추가 기술 사항

  • OS 부팅 시 자동 실행
  • 웹 브라우저의 페이지 뷰를 기록하여 통계
  • 멀티 탭 브라우저일 때 탭만 종료하기

배운것

2월 21일

  • 윈도우 API 테스트
    • windows API로 프로세스의 정보 받아오기 (원본)
~cpp
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include <Windows.h>
#include <TlHelp32.h>

void killProcess(TCHAR*);

int _tmain(int argc, TCHAR *argv[]){
	// snap every current process 
	HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

	if(hProcessSnap == INVALID_HANDLE_VALUE) {
		_tprintf(_T("CreateToolhelp32Snapshot erre\n"));
		exit(EXIT_FAILURE);
	}

	// structure to hold process's inform
	PROCESSENTRY32 pe32;
	pe32.dwSize = sizeof(PROCESSENTRY32);

	// Process32First :: get the first process snapshot
	if(!Process32First(hProcessSnap, &pe32)){
		_tprintf(_T("Process32First error!\n"));
		CloseHandle(hProcessSnap);
		exit(EXIT_FAILURE);
	}

	_tprintf(_T("\t[Process name]\t[PID]\t[ThreadID]\t[PPID]\n"));
	int countProcess=0;
	do{
		countProcess += 1;
		_tprintf(_T("%25s %8d %8d %8d\n"), 
			pe32.szExeFile, pe32.th32ProcessID, pe32.cntThreads, pe32.th32ParentProcessID);
	}while(Process32Next(hProcessSnap, &pe32));
	printf("number of process = %d", countProcess);

	return 0;
}
    • 특정 프로세스 죽이기 (원본)
~cpp
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include <Windows.h>
#include <TlHelp32.h>

void killProcess(TCHAR*);

int _tmain(int argc, TCHAR *argv[]){
	// kill process
	TCHAR *targetProcess = _T("NateOnMain.exe"); // 종료하려는 프로세스의 이름을 쓴다
	killProcess(targetProcess);
	return 0;
}

// Works fine
void killProcess(TCHAR *target){
	HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	PROCESSENTRY32 pe32;
	pe32.dwSize = sizeof(PROCESSENTRY32);


	HANDLE hProcess = NULL;
	do{
		if(0 == _tcscmp(pe32.szExeFile, target)){
			// get the process handle
			hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);

			if(hProcess){
				// kill it
				TerminateProcess(hProcess, -1);
				CloseHandle(hProcess);
				printf("종료 성공!");
				break;
			}
		}
	}while(Process32Next(hProcessSnap, &pe32));

	CloseHandle(hProcessSnap);
}