2010-11-22 31 views
1

Başka bir uygulamayı "dinlemek" istiyorum ve sonlandırıldığında ne yapacağına karar vermek istiyorum.Başka bir işlemden mesaj nasıl iletilir?

Nasıl?

Düzeltme: İki program aynı bilgisayarda çalıştırılıyor ve diğer programı kapattığımda bilmek istiyorum. Ve sonra diğer programda harekete geçin. Diğer program kodunu değiştiremiyorum. App A'dan B uygulamasını başlatabilir veya başlatmayabilirim. Uygulamayı B'ye tam yolundan tanımlayabilirim.

+1

Tam olarak hangi ilişkiyi uygulamanızın A'yı sonlandırmak için izlemek istediğiniz uygulama B ile tanımlamanız gerekir. Uygulama B'yi örneğin 'CreateProcess' ile ilgili uygulama A'dan başlatır mısın? Değilse, o zaman "Uygulama B'yi nasıl tanımlarsınız: dosya adına göre, pencere başlığı ve benzeri?". Uygulama B bir GUI uygulaması mı, örneğin bir konsol uygulaması mı yoksa bir windows servisi mi? Devam edebilirim ... Şu anki soru çok fazla yorumlanabilir. – Oleg

+0

Biraz daha bilgi ekledim – Newbie

cevap

4

WaitForSingleObject(hProcess, INFINITE);

+0

İlgili hProcess değerini buradan nasıl alabilirim? – Newbie

+0

Ayrıca, bu program diğer program çıkana kadar donmuyor mu? – Newbie

+0

Donmayı sevmiyorsanız, farklı bir ileti dizisinde bekleyebilir ve bekleme sona erdiğinde kendinize bir ileti gönderebilirsiniz. Ya da MsgWaitForMultipleObjects kullanın. –

0

sadece istediğiniz aralıklarla OS süreç listesini alabilirsiniz ve

+0

Bu konuda bazı problemlerim vardı, bu yüzden – Newbie

5

Abyx yazdığı gibi WaitForSingleObject (ya da muhtemelen WaitForMulipleObjects) ihtiyacınız API fonksiyonudur gerekli işlemleri yaparız. >

  • handle1 süreci için işlemek Get izlenmesi -
    1. olay Konuya işlemek geçmek bir (işçi) iş parçacığı
    2. başlatın bir olay
    3. oluşturun. Bkz. How can I get a process handle by its name in C++? -> HANDLE2
    4. İş parçacığınızda WaitForMulipleObjects numaralı telefonu arayın ve iki kolu bekleyin.
    5. Eğer HANDLE2 patlarsa, ne yapmak istediğinizi yapın ... ve muhtemelen ipliği sonlandırın.
    6. HANDLE1'in çalışması durumunda, dişi bırakın. Bu, uygulamanızın zarif bir şekilde sonlandırılması içindir: Ana (GUI) diziden çıkmadan önce olayı belirlersiniz. Kendini başlatırsanız
  • +0

    'un daha kolay bir yolunu düşünüyordum, 1-4 arasındaki adımların nasıl yapılacağına dair bir fikrim yok, bu durumda "yangınlar" dan ne demek istiyorsunuz? 7 ile demek istediğim, ana programım kesilirse, oluşturduğum iş parçacığından çıkmam gerekiyor mu? windows bunu otomatik olarak ele almıyor mu? – Newbie

    +0

    "Ateşler" ile kastettiğim, işaretsiz durumdan sinyallenen duruma geçiştir. Bkz. MSDN, "SetEvent" http://msdn.microsoft.com/en-us/library/ms686211(VS.85).aspx. –

    +0

    Evet, Windows iş parçanızı sonlandıracak ancak iş parçacığınızda biraz temizleme yapmanız gerekebilir (ör., Bir günlük dosyasını kapatın). Bu bir tarz meselesi: Eğer bir iplik oluşturursanız, onu sonlandırma aracınızın olması gerekir. Tamlık için –

    1

    , sen CreateProcess göre örneğin beklemek istiyorum sonlandırma işlemi, süreç sonunda bekleyerek

    WaitForSingleObject(pi.hProcess, INFINITE); 
    

    süreç ise çok basit olan sonlandırma Eğer sürecinin kimliği dwProcessId bulmalısınız önce başlatılır, bekleyin istiyoruz ve sonra

    HANDLE hProcess = OpenProcess (SYNCHRONIZE, FALSE, dwProcessId); 
    WaitForSingleObject(hProcess, INFINITE); 
    

    işlem kimliği aramayı yapan w farklı uygulanabilir aşağıdakileri yapın Ay, süreç hakkında bildiğiniz bilgilere ve işlemin kaç örneğinin eşzamanlı olarak çalışabileceğine bağlıdır. Örneğin, şu anda çalışan işlemin dosya adını biliyorsanız, EnumProcesses, OpenProcess ve GetProcessImageFileName'u kullanabilirsiniz. İşte ilgili kod basitleştirilmiş bir formdadır:

    #include <Windows.h> 
    #include <stdio.h> 
    #include <tchar.h> 
    #include <Psapi.h> 
    #include <shlwapi.h> 
    
    #pragma comment (lib, "Psapi.lib") 
    #pragma comment (lib, "shlwapi.lib") 
    
    int _tmain (int argc, LPCTSTR argv[]) 
    { 
        DWORD arProcessIds[1024], cbNeeded, i, dwStatus; 
        HANDLE hProcess = NULL; 
        LPCTSTR pszProcessName = NULL; 
    
        if (argc != 2) { 
         _tprintf (TEXT("USAGE:\n") 
            TEXT(" \"%s\" ExeName\n\n") 
            TEXT("Examples:\n") 
            TEXT(" \"%s\" TaskMgr.exe\n"), 
            argv[0], argv[0]); 
         return 1; // error 
        } 
        pszProcessName = argv[1]; 
    
        if (!EnumProcesses (arProcessIds, sizeof(arProcessIds), &cbNeeded)) { 
         // here shold be allocated array dynamically 
         return 1; // error 
        } 
        for (i = 0; i < cbNeeded/sizeof(DWORD); i++) { 
         if (arProcessIds[i] != 0) { 
          TCHAR szFileName[MAX_PATH]; 
          hProcess = OpenProcess (PROCESS_QUERY_INFORMATION | SYNCHRONIZE, FALSE, arProcessIds[i]); 
          if (hProcess != NULL) { 
           dwStatus = GetProcessImageFileName (hProcess, szFileName, sizeof(szFileName)/sizeof(TCHAR)); 
           if (dwStatus > 0) { 
            LPCTSTR pszFileName = PathFindFileName (szFileName); 
            //_tprintf(TEXT("Process: %s\n"),szFileName); 
            if (StrCmpI(pszFileName, pszProcessName) == 0) { 
             break; 
            } 
           } 
           CloseHandle (hProcess); 
           hProcess = NULL; 
          } 
         } 
        } 
        //hProcess = OpenProcess (SYNCHRONIZE, FALSE, dwProcessId); 
        if (hProcess == NULL) { 
         _tprintf(TEXT("The process \"%s\" is not found.\n"), pszProcessName); 
         return 1; 
        } 
    
        _tprintf(TEXT("Start waiting for the end of the process %s\n"), pszProcessName); 
        WaitForSingleObject(hProcess, INFINITE); 
        _tprintf(TEXT("The process is terminated")); 
        CloseHandle (hProcess); 
    
        return 0; 
    } 
    
    İlgili konular