[c++] Sprawdzenie czy plik jest uruchomiony

0

Witam.

Mam mały problem ze sprawdzaniem czy dany program jest uruchomiony obecnie czy nie.

Do tej pory wyszukiwałem program za pomocą nazwy aplikacji

   int Application;
   AnsiString zm= Edit1->Text;
   Application = (int)FindWindow(NULL, zm.c_str());
   if (Application == 0)
	  {
	   Caption = Edit1 -> Text + " is OFF!";
	  }else{
		   Caption = Edit1->Text + " is ON!";
		   }

Jednak niektóre aplikacje zmieniają nazwę programu i wtedy program nie działa (przykład - notatnik jak zapiszemy plik pod jakąś nazwą).

I tu moje pytanie - czy jest jakiś sposób aby sprawdzić czy plik z danej ścieżki jest uruchomiony ?
Myślałem o sprawdzeniu czy dany plik jest używany przez system ale nie mogę tego oprogramować :(

0

Tak... tylko mi chodzi o platformę Windows a nie szukanie w bibliotekach pod Gnome...

Ma ktoś może pomysł jak za pomocą samej ścieżki sprawdzić czy program jest uruchomiony ? A jak się da to ile instancji :)

Zaczynam myśleć o tym aby zczytywać procesy i w nich szukać ale to nie rozwiązanie takie jakbym chciał :(

0

A kto powiedział, że to nie pójdzie pod Windą. Osobiście myślę, że nie ma przeciwwskazań do działania. Jak jak to też nie to możesz zrobić jakąś komunikację międzyprocesorową jak Dbus i sprawdzać czy przyszła odpowiedź, jak nie to nie nie ma jeszcze instancji programu.

0

szczerze... nie wiem czy sobie poradzę z tym ale popróbuję jutro bo potrzebuję tego :)

0

Zaczynam myśleć o tym aby zczytywać procesy i w nich szukać

A czemu to taki problem? Na oko 10 linijek kodu. Szukanie po nazwie okna jest bardzo głupie, bawienie się bibliotekami gnome pod windowsem jeszcze głupsze. Poza tym, niby jak to libunique pomoze np sprawdzic czy jest uruchomiony np. Microsoft Word? Oświeccie mnie, bo z tego co widzę ta biblioteka jest do czego innego.

0

Łe, źle zrozumiałem. Ja myślałem, że mu chodzi o sprawdzenie czy jego program już działa.

0

szukaj po nazwie klasy okna a nie po nazwie - klasa jest z reguly stala. jak masz juz znalezione okno to pobierasz nazwe klasy:
http://msdn.microsoft.com/en-us/library/ms633582(VS.85).aspx
i pozniej po odczytaniu sobie tej nazwy klasy wyszukujesz okno dokladnie po niej:
hwnd=FindWindow(nazwaklasy,NULL);

0
#include "stdafx.h"
#include <windows.h>  
#include <psapi.h>
#include <stdio.h>
#include <tchar.h>

bool TestProc(DWORD procID,_TCHAR * name);

int _tmain(int argc, _TCHAR* argv[])
{
  DWORD    procID[1024],cbRet;
  DWORD    procCount;
  unsigned int i;

  if (!EnumProcesses(procID,sizeof(procID),&cbRet))
   return 99;        // Bląd ??

  procCount = cbRet / sizeof(DWORD);

  for (i=0; i < procCount; i++)
   {
    if (procID[i] != 0)
      {
       TestProc(procID[i],argv[1]);
      }
   }
  return 0;
}

bool TestProc(DWORD procID,_TCHAR * name)
{
  TCHAR procName[MAX_PATH];

  HANDLE hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, procID);

  if (hProc != NULL)
    {
     DWORD   cbSize = sizeof(procName);
#ifdef VISTA
      if (QueryFullProcessImageName(hProc,0,procName,&cbSize))
#else
     cbSize = GetProcessImageFileName(hProc,procName,sizeof(procName));
     if (cbSize != 0)
#endif
       {
        printf("%s\n",procName);  

// Tu sprawdz sobie czy to ten process o który Ci chodzi np przez porównanie nazwy
        CloseHandle(hProc);
        return true;               // jeśli to ten
       }
    }
  CloseHandle(hProc);
  return false;
}

Jeśli chcesz sprawdzić czy konkretny exe został uruchomiony (przepraszam za kolokwializm) to chyba najpewniejsza droga, jeśli jednak interesuje Cię konkretne okno to są oczywiście inne sposoby.

0

hehehehe ale ten kod to vista+ :-D
Z nowych funkcji mozna oczywiscie kozystac, ale program musi miec 2 galezie, w zaleznosci od versji windowsa.

Tego sie nie da zrobic, bo po co sprawdzac 'czy .exe jest uruchomiony'. Exe moze byc conajwyzej zaladowany jako modul, i to mozna sprawdzic, ale udokumentowanej metody NIE MA.

0
asdf312 napisał(a)

hehehehe ale ten kod to vista+ :-D
Z nowych funkcji mozna oczywiscie kozystac, ale program musi miec 2 galezie, w zaleznosci od versji windowsa.

Przed chwilą uruchomiłem ten kod na WindowsXP i działa. Fakt - nie będzie chodził na Windows2000 .

Jeśli ma być używany w wielu środowiskach to możesz skorzystać dynamicznego ładowania wybranego DLL i wywołać odpowiednią funkcję.

0
asdf312 napisał(a)

Tego sie nie da zrobic, bo po co sprawdzac 'czy .exe jest uruchomiony'. Exe moze byc conajwyzej zaladowany jako modul, i to mozna sprawdzic, ale udokumentowanej metody NIE MA.

Kolego h3x, nie [CIACH!], 'uruchomiony' jest główny moduł aplikacji, przynajmniej z punktu widzenia architektury Windowsa. Skoro główny moduł aplikacji jest wyszczególniony to... Udokumentowane metody są, w oparciu o PSAPI.

BTW, poprawiłem bana, jednego skurwiela mniej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1