Partage
  • Partager sur Facebook
  • Partager sur Twitter

Process exist

    25 octobre 2016 à 0:53:12

    Bonjour , voila mon problème,

    j'ai fait un programme qui verifie si un processus tourne alors il lance des commandes mais si il tourne pas il en fait rien.

    le probleme que j'ai remarquer et que process exist ne marche que sur des processus en 32 bit mais il ne reconnais pas les 64 bit et je n'arrive pas a trouver sur le net plus de renseignement alors je vien vous demander votre aide.

    voici mon code 

    // Determine si un processus est en cours d'execution ou pas
    BOOL process_exists(const char* monProcess)
    {
    	DWORD processes[200], nb_processes;
    	char process_name[100];
    	int i;
    	HANDLE hprocess;
    
    	EnumProcesses(processes, sizeof(processes),&nb_processes);
            //On teste tous les processus pour voir si leur nom correspond
    	for(i=0;i<nb_processes/sizeof (DWORD);i++)
      	{
    		hprocess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processes[i]);
    		//Prend le nom du processus et le met dans process_name
    		GetModuleBaseName(hprocess, NULL, process_name, sizeof(process_name) );
    		CloseHandle(hprocess);
                    //Ce processus est il le même que celui demandé
    		if(!strcasecmp(process_name, monProcess)){
    			return TRUE;
    		}
    	}
    	return FALSE;
    }
    
    int main()
    {
    for (;   {
        if(process_exists("programme32bit.exe"))
        {
           puts("oui");
     
         Sleep(1000);
        }
        else
        {
           puts("non");
           Sleep(1000);
        }
        if(process_exists("programme64bit.exe"))
        {
           puts("oui");
           Sleep(1000);
        }
        else
        {
           puts("non");
        system("start 
        Sleep(1000);
        }
    
        Sleep(10000);
    }
    return 0;
    }

    J'espère que vous pouvez m'aider

    merci

    • Partager sur Facebook
    • Partager sur Twitter
      25 octobre 2016 à 2:00:47

      Plop,
      Vite fait mal fait (enfin pomper sur http://stackoverflow.com/questions/1431103/how-to-obtain-data-from-wmi-using-a-c-application et adapter pour les process):

      #define _WIN32_WINNT 0x0400
      #define _WIN32_DCOM
      
      #include <stdio.h>
      #include <tchar.h>
      #include <windows.h>
      #include <wbemidl.h>
      
      #pragma comment(lib , "wbemuuid.lib")
      void _tmain(int argc, _TCHAR* argv[])
      {
      	// result code from COM calls
      	HRESULT hr = 0;
      
      	// COM interface pointers
      	IWbemLocator         *locator = NULL;
      	IWbemServices        *services = NULL;
      	IEnumWbemClassObject *results = NULL;
      
      	// BSTR strings we'll use (http://msdn.microsoft.com/en-us/library/ms221069.aspx)
      	BSTR resource = SysAllocString(L"ROOT\\CIMV2");
      	BSTR language = SysAllocString(L"WQL");
      	BSTR query = SysAllocString(L"SELECT * FROM Win32_Process");
      
      	// initialize COM
      	hr = CoInitializeEx(0, COINIT_MULTITHREADED);
      	hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
      
      	// connect to WMI
      	hr = CoCreateInstance(&CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, &IID_IWbemLocator, (LPVOID *)&locator);
      	hr = locator->lpVtbl->ConnectServer(locator, resource, NULL, NULL, NULL, 0, NULL, NULL, &services);
      
      	// issue a WMI query
      	hr = services->lpVtbl->ExecQuery(services, language, query, WBEM_FLAG_BIDIRECTIONAL, NULL, &results);
      
      	// list the query results
      	if (results != NULL) {
      		IWbemClassObject *result = NULL;
      		ULONG returnedCount = 0;
      
      		// enumerate the retrieved objects
      		while ((hr = results->lpVtbl->Next(results, WBEM_INFINITE, 1, &result, &returnedCount)) == S_OK) {
      			VARIANT ProcessId;
      			VARIANT Name;
      			VARIANT CommandLine;
      			VARIANT ExecutablePath;
      
      			// obtain the desired properties of the next result and print them out
      			hr = result->lpVtbl->Get(result, L"ProcessId", 0, &ProcessId, 0, 0);
      			hr = result->lpVtbl->Get(result, L"Name", 0, &Name, 0, 0);
      			wprintf(L"PID: %d : %s\n", ProcessId.uintVal, Name.bstrVal);
      			if (ProcessId.uintVal > 1000) // pour sauter les process system qui qui font planter le programme
      			{			
      				if ((hr = result->lpVtbl->Get(result, L"CommandLine", 0, &CommandLine, 0, 0)) == S_OK)
      					wprintf(L"\t%s\n", CommandLine.bstrVal);
      				if ((hr = result->lpVtbl->Get(result, L"ExecutablePath", 0, &ExecutablePath, 0, 0)) == S_OK)
      					wprintf(L"\t%s\n", ExecutablePath.bstrVal);
      			}
      			// release the current result object
      			result->lpVtbl->Release(result);
      		}
      	}
      
      	// release WMI COM interfaces
      	results->lpVtbl->Release(results);
      	services->lpVtbl->Release(services);
      	locator->lpVtbl->Release(locator);
      
      	// unwind everything else we've allocated
      	CoUninitialize();
      
      	SysFreeString(query);
      	SysFreeString(language);
      	SysFreeString(resource);
      }

      (compiler sous VS community 2013 - eh si tu as pas Visual studio, râle pas parce que il te manque tel ou telle chose!)

      (code minimal sans vérifications de sécurité, c'est pour cela que les lignes 52->58 sautent les process systeme)

      -
      Edité par breizhbugs 25 octobre 2016 à 2:01:39

      • Partager sur Facebook
      • Partager sur Twitter
      ** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
        25 octobre 2016 à 3:46:05

        Compiler sur VS 2010 erreur dans les libs et sur code block pareil
        • Partager sur Facebook
        • Partager sur Twitter
          25 octobre 2016 à 11:54:29

          OlivierMathieu1 a écrit:

          Compiler sur VS 2010 erreur dans les libs et sur code block pareil


          Vachement informatif...
          • Partager sur Facebook
          • Partager sur Twitter
          ** La doc, c'est comme le PQ: ça sert à se démerder tout seul **

          Process exist

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown