그때 급하게 수정하느라고 답변을 늦게 다네요..
꼭 필요했던 기능이였는데 도움주셔서 감사합니다.
앞으로 좀더 자세히 보고 해야겠네요 ㅎㅎ
장성호 님이 쓰신 글 :
: 음...
:
: 먼저 3초마다 반복해서 호출할것이라면
:
: Thread를 이용해서 한번만 CreateProcess해서 route.exe를 실행한후에
: 필요할때마다 Command를 tx 해서 받아오는것도 한 방법일듯 합니다.
:
:
: 그것 그렇구
:
: 보통 프로그램이 일정시간동안 잘 돌아가다가 죽는 경우는
: 1. 메모리가 어디 새거나..
: 2. 핸들이 계속 증가 하거나 하는 경우가 대부분이죠
:
: 그것을 쉽게 확인하는 방법은
: 1. 작업관리자를 띄워서요
: 2. 작업관리자->보기->열선택 에서 "메모리 사용" 과 "핸들" ,"쓰레드" 등을 체크해보세요
: 3. 그런다음 프로그램을 띄워놓고 해당항목의 변화를 지켜보세요
:
:
: 님의 프로그램을 보니... "핸들"이 한번 Timer가 호출될때마다 2개씩 증가하네요
: 그렇다면 Handle을 열고난뒤에 닫지 않은 핸들이 있다는것인데...
:
: 코드를 한줄씩 디버깅하면서 실행해 보면
: 핸들이 증가하는데는 CreatePipe 와 CreateProcess 두군데서 2개씩 증가하여 총 4개가 증가하네요
:
: 그런데 CloseHandle을 2군데 뿐이네요
:
: 그렇다면 닫지 않은 핸들이 무엇일까요?
: CreatePipe로 생성한 핸들 hread , hwrite 두개는 CloseHandle 했구요
:
: 나머지 두개는 바로..
:
: PROCESS_INFORMATION 구조체에 있습니다.
: 구조체를 보면 다음과 같이 선언되어있습니다.
:
:
: ypedef struct _PROCESS_INFORMATION {
: HANDLE hProcess;
: HANDLE hThread;
: DWORD dwProcessId;
: DWORD dwThreadId;
: } PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;
:
:
: 위 구조체를 보면 hProcess와 hThread가 HANDLE로 선언되어 있는것을 확인할 수 있을 것입니다.
: 그러므로 님께서 닫지 않은 핸들은 바로
:
: hProcess와 hThread 두개이네요
:
: 코드 맨마지막에
: CloseHandle(pi.hThread);
: CloseHandle(pi.hProcess);
:
: 해주면 문제가 해결 될듯..
:
:
: 그럼..
:
:
:
: 번외편 님이 쓰신 글 :
: : 네이버에 찾아보니깐 virus 나 다른것들 때문에 오류가 난다고 하는데...
: : 혹시나 몰라 한번 여쭤봅니다. 소스중에 이상한부분이나 잘못쓰고 있는점 있으면 지적해주세요
: : 타이머로 3초마다 한번씩 실행시키는데 어느정도(2,3시간?) 켜노면
: : 응용프로그램 오류가 뜨네요..
: :
: : void __fastcall TForm1::Timer9Timer(TObject *Sender)
: : {
: : int i,j;
: : bool flag;
: : HANDLE hwrite, hread;
: : SECURITY_ATTRIBUTES sa;
: : sa.nLength = sizeof(SECURITY_ATTRIBUTES);
: : sa.lpSecurityDescriptor = NULL;
: : sa.bInheritHandle = true;
: :
: : flag = CreatePipe(&hread, &hwrite, &sa, 0);
: :
: : STARTUPINFO si;
: : memset(&si, 0, sizeof(STARTUPINFO));
: : si.cb = sizeof(STARTUPINFO);
: : si.dwFlags = STARTF_USESTDHANDLES;
: : si.hStdOutput = hwrite;
: : si.hStdError = hwrite;
: : PROCESS_INFORMATION pi;
: :
: : flag = CreateProcess(NULL, "route print", NULL, NULL,True, DETACHED_PROCESS,
: : NULL, NULL, &si, &pi);
: :
: : CloseHandle(hwrite);
: :
: : char buffer[512];
: : DWORD BytesRead;
: : AnsiString ResultString;
: : char IP_Gateway[30];
: : int IP_Index;
: : while(ReadFile(hread, buffer, sizeof(buffer)-1, &BytesRead, NULL) && BytesRead)
: : {
: : buffer[BytesRead] = '\0';
: : ResultString = ResultString + buffer;
: : }
: : CloseHandle(hread);
: : IP_Index = ResultString.AnsiPos("Default Gateway:");
: : memcpy(IP_Gateway,&ResultString[IP_Index+22],30);
: : j=3;
: : for( i=0;i<30;i++)
: : {
: : if(IP_Gateway[i] == '.' )
: : {
: : j--;
: : }
: :
: : if( j == 0 )
: : {
: : j = i +1 ;
: : break ;
: : }
: : }
: : memset(&IP_Gateway[j],0,(30 - j) );
: :
: : if(strstr(Label8->Caption.c_str(),IP_Gateway)!=NULL)
: : {
: : Network = 1;
: : }
: : else if(strstr(Label9->Caption.c_str(),IP_Gateway)!=NULL)
: : {
: : Network = 2;
: : }
: : else if(strstr(Label10->Caption.c_str(),IP_Gateway)!=NULL)
: : {
: : Network = 3;
: : }
: : else if(strstr(Label11->Caption.c_str(),IP_Gateway)!=NULL)
: : {
: : Network = 4;
: : }
: : else
: : {
: : Network = 0;
: : }
: : }