2013-06-06 2 views
1

안녕하세요.이 코드를 확인해주세요. 내 응용 프로그램 "piko.exe"를 실행 한 후 프로세스를 실행하고 "non.exe", "firefox.exe", "lol.exe"와 같은 프로그램이 실행되는 경우 if 실행 내 응용 프로그램을 종료하고 오류를 반환합니다.매 30 초마다 C++로 체크 처리

하지만이 체크 프로세스를 30 초마다하고 있지만 내 주 프로그램 (이 코드는 내 프로젝트의 한 부분입니다)이 필요합니다. 가능한 경우 pls 누군가가 내 코드를 편집하여 감사드립니다.

#include "StdInc.h" 
#include <windows.h> 
#include <tlhelp32.h> 
#include <tchar.h> 
#include <stdio.h> 


void find_Proc(){ 



HANDLE proc_Snap; 
HANDLE proc_pik; 
HANDLE proc_pikterm; 

PROCESSENTRY32 pe32; 
PROCESSENTRY32 pe32pik; 

int i; 
char* chos[3] = {"non.exe","firefox.exe","lol.exe"}; 

char* piko = "piko.exe"; 

proc_pik = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
proc_Snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 

pe32.dwSize = sizeof(PROCESSENTRY32); 
pe32pik.dwSize = sizeof(PROCESSENTRY32); 


for(i = 0; i < 3 ; i++){ 

    Process32First(proc_Snap , &pe32); 
    do{ 

     if(!strcmp(chos[i],pe32.szExeFile)){ 
      MessageBox(NULL,"CHEAT DETECTED","ERROR",NULL); 
      Process32First(proc_pik,&pe32pik); 
       do{ 

        if(!strcmp(iw4m,pe32pik.szExeFile)){ 

         proc_pikterm = OpenProcess(PROCESS_ALL_ACCESS, TRUE, pe32pik.th32ProcessID); 

         if(proc_pikterm != NULL) 
          TerminateProcess(proc_pikterm, 0); 
         CloseHandle(proc_pikterm); 
        } 

       } while(Process32Next(proc_pik, &pe32pik)); 

    } 

} while(Process32Next(proc_Snap, &pe32)); 
} 
CloseHandle(proc_Snap); 

CloseHandle(proc_pik); 
} 
+0

둘째, 루프의 순서를 교환해야합니다. 또한 프로세스를 찾기 위해 두 번째 스냅 샷이 필요하지 않습니다. 사용자가 "Cheat Detected"메시지에서 "OK"를 클릭하지 않으면 프로그램은 절대로 TerminateProcess를 호출하지 않습니다. –

답변

0

당신이 시스템 시간을 폴링하고 30 초 만료 있는지 확인할 수 있습니다 사용중인 OS를 기반으로. 이렇게하는 방법은 루프의 시작 부분에서 시간을 들여 마지막에 시간을 들여이를 빼는 것입니다. 그런 다음 코드를 루틴을 실행하는 데 걸린 시간부터 잠자기하고 싶은 시간을 빼십시오.

또한 정확히 30 초가 필요하지 않으면 루프에 sleep (30)을 추가하면됩니다.

+0

잠자기에는 Windows에서 수 밀리 초가 소요됩니다. 그래서 30 초 수면 (30000) – typ1232

+0

모습은 내가 (사실) ' 동안 { ... } 수면 (30) ' 를 사용하지만 내 주요 응용 프로그램은 내가 다른 방법이 필요하므로 작동이 중지?! –

+0

@artines : 앱에서 또 무엇을합니까? UI가 있습니까? 'SetTimer'를 사용하여 30 초마다'WM_TIMER'를 보내고 여러분이 그것을 볼 때 검사를 해보십시오. –

0

왜이 방법이 효과가 없을지 설명해 주시겠습니까? 아래 코드는 매초마다 하나의 값을 카운트하도록 설계되었습니다. "checkMyProcess"가 수면 호출 전에 while 루프 내에서 필요로하는 모든 작업을 수행하도록하십시오. 이 같은 프로그램 내에서, while 루프의 외부에서 작업을 수행하려는 경우, 당신이 스레딩을 사용하거나 프로세스의 한 쌍의 포크해야 물론

#include <iostream> 
using namespace std; 

int someGlobal = 5;//Added in a global so you can see what fork does, with respect to not sharing memory! 

bool checkMyProcess(const int MAX) { 
    int counter = 0; 
    while(counter < MAX) { 
     cout << "CHECKING: " << counter++ << " Global: " << someGlobal++ << endl; 
     sleep(1); 
    } 
} 

void doOtherWork(const int MIN) { 
    int counter = 100; 
    while(counter > MIN) { 
     cout << "OTHER WORK:" << counter-- << " Global: " << someGlobal << endl; 
     sleep(1); 
    } 
} 

int main() { 
    int pid = fork(); 

    if(pid == 0) { 
     checkMyProcess(5); 
    } else { 
     doOtherWork(90); 
    } 
} 

알고 있습니다.

편집 :

내가 전화에 추가 "포크"에 동시에 일을하는 두 프로세스를 볼 수 있습니다. 참고 : "checkMyProcess"함수가 "doOtherWork"함수에서 진행되는 메모리에 대해 알고 있어야 할 경우 스레딩이 훨씬 쉬운 해결책이 될 것입니다!

관련 문제