2009-12-06 15 views
8

निर्धारित करें मैंने इस उपयोगिता (exe) को लिखा है जिसे इस होस्ट एप्लिकेशन के भीतर से बुलाया जा सकता है। और मैं इसे पसंद करूंगा कि उपयोगिता केवल होस्ट एप्लिकेशन से ही बुलाया जा सके। इसे बाहर या किसी अलग मेजबान से चलाना तुरंत उपयोगिता को समाप्त करना चाहिए।वर्तमान ऐप की मूल प्रक्रिया

वहाँ जो प्रक्रिया मेरी उपयोगिता का शुभारंभ पता लगाने के लिए एक तरीका है?

उत्तर के लिए धन्यवाद।

+0

मुझे SysInternals ProcessExplorer मिला है, जो मुझे वर्तमान में चल रही सभी प्रक्रियाओं का पेड़ दिखाता है और प्रत्येक को किसके द्वारा लॉन्च किया गया था, इसलिए जानकारी निश्चित रूप से उपलब्ध है। प्रश्न यह है कि इसे कैसे पहुंचाया जाए, जिसे मैं नहीं जानता, दुर्भाग्य से। मैं आपकी पोस्ट में "winapi" टैग जोड़ूंगा और इसे थोड़ा स्पष्ट कर दूंगा कि आप यही खोज रहे हैं। –

+0

मैंने देखा है कि सबसे अच्छा जवाब है http://stackoverflow.com/a/3346055/647492 –

उत्तर

9

आप चल प्रक्रिया सूची और फिर Process32First समारोह की गणना करने में CreateToolhelp32Snapshot फ़ंक्शन का उपयोग th32ParentProcessID जो प्रक्रिया है कि इस प्रक्रिया को (अपनी मूल प्रक्रिया) बनाया का पहचानकर्ता है पाने के लिए कर सकते हैं।

इस उदाहरण को देखें।

uses 
    Psapi, 
    Windows, 
    tlhelp32, 
    SysUtils; 

function GetTheParentProcessFileName(): String; 
const 
    BufferSize = 4096; 
var 
    HandleSnapShot : THandle; 
    EntryParentProc : TProcessEntry32; 
    CurrentProcessId: DWORD; 
    HandleParentProc: THandle; 
    ParentProcessId : DWORD; 
    ParentProcessFound : Boolean; 
    ParentProcPath  : String; 

begin 
    ParentProcessFound := False; 
    HandleSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //enumerate the process 
    if HandleSnapShot <> INVALID_HANDLE_VALUE then 
    begin 
    EntryParentProc.dwSize := SizeOf(EntryParentProc); 
    if Process32First(HandleSnapShot, EntryParentProc) then //find the first process 
    begin 
     CurrentProcessId := GetCurrentProcessId(); //get the id of the current process 
     repeat 
     if EntryParentProc.th32ProcessID = CurrentProcessId then 
     begin 
      ParentProcessId := EntryParentProc.th32ParentProcessID; //get the id of the parent process 
      HandleParentProc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ParentProcessId); 
      if HandleParentProc <> 0 then 
      begin 
       ParentProcessFound := True; 
       SetLength(ParentProcPath, BufferSize); 
       GetModuleFileNameEx(HandleParentProc, 0, PChar(ParentProcPath),BufferSize); 
       ParentProcPath := PChar(ParentProcPath); 
       CloseHandle(HandleParentProc); 
      end; 
      break; 
     end; 
     until not Process32Next(HandleSnapShot, EntryParentProc); 
    end; 
    CloseHandle(HandleSnapShot); 
    end; 

    if ParentProcessFound then 
    Result := ParentProcPath 
    else 
    Result := ''; 
end; 
+0

धन्यवाद आरआरयूजेड !!! वास्तव में जो मैं खोज रहा हूं। :) – Rick

1

इस आवेदन केवल मेजबान अंदर से चलाया जा रहा है, तो क्यों न सिर्फ मुख्य अनुप्रयोग के भीतर आवेदन के लिए रूपों में शामिल हैं, और आप के रूप में सक्रिय होगा एक और रूप?

+2

हमने इस होस्ट एप्लिकेशन को नहीं लिखा था। एक और ऐप निष्पादित करने की केवल यही क्षमता है। मुझे बस यह पता चला कि वे इसे कैसे निष्पादित कर रहे हैं। धन्यवाद टिम! – Rick

2

मैं एक अतिरिक्त पैरामीटर है कि आप केवल के बारे में पता जोड़ना होगा .. (यह एक GUID हो सकता है) यदि वह GUID पैरामीटर आपकी उपयोगिता के लिए पारित का हिस्सा नहीं है आवेदन बर्खास्त अभी।

+0

मैं उस रास्ते पर गया हूं। समस्या यह है कि यूटिलिटीज को पास किए गए पैरामीटर होस्ट ऐप के सेटअप या सेटिंग्स स्क्रीन के माध्यम से देखे जा सकते हैं। और मैं मेजबान ऐप को कहीं और जादू की कुंजी देखने के लिए भी निर्देश नहीं दे सकता। धन्यवाद जीएस! – Rick

2

अपने प्रश्न का त्वरित जवाब "ठीक है, नहीं, तुम एक आवेदन निष्पादित किया जा रहा से नहीं रोका जा सकता है।" यदि यह निष्पादन योग्य है, तो इसे निष्पादित किया जा सकता है। इसे रोकने का कोई तरीका नहीं है।

और, यदि आप एप्लिकेशन को नियंत्रित नहीं कर सकते हैं (जैसा कि आपकी टिप्पणियां इंगित होती हैं) तो जीएस का उत्कृष्ट सुझाव काम नहीं करेगा, है ना? आपके पास ऐप क्या करता है इसे नियंत्रित करने का कोई तरीका नहीं है और आप अपनी विशेष कमांड लाइन पर इसकी प्रतिक्रिया को नियंत्रित नहीं कर सकते हैं।

तो यह एक दिलचस्प स्थिति को पेश करता है।

एक ही रास्ता है कि मैं इस के आसपास देखने के लिए पूरी तरह से कम से कम EXE के लिए उपयोग को रोकने के लिए, या यह यह मुश्किल बनाने के लिए है।

आप ऐसा कर सकता है: एक संसाधन

  • के रूप में अपने मेजबान EXE में

    1. एम्बेड EXE समय EXE चलाने की बात आती है, तो यह से TResourceStream बाहर का उपयोग कर
    2. लिखें यह निकालने TFileStream का उपयोग कर TResourceStream
    3. इसे निष्पादित करें
    4. जब आप पूरा कर लें तो इसे हटाएं।

    सुंदर नहीं है, लेकिन यह एकमात्र तरीका है जिसे मैं EXE को अपनी शर्तों और आपकी शर्तों पर चलने से रोकने के बारे में सोच सकता हूं।

  • +3

    ऐसा लगता है कि वह क्या पूछ रहा है कि यदि ऐप लॉन्च करने वाली प्रक्रिया की पहचान सत्यापित करना संभव है, और फिर यह गलत है तो तुरंत समाप्त हो जाए। यह संभव होना चाहिए। –

    1

    हम एक काफी सरल तकनीक का उपयोग करते हैं जो कोड की कुछ पंक्तियां लेता है। अभिभावक ऐप और उपयोगिता ऐप कुछ सामान्य GUIID तारों (कोड में) का उपयोग करता है और "हैलो" हैंडशेक प्रोटोकॉल बनाने के लिए RegisterWindowMessage को कॉल करता है। जब उपयोगिता ऐप पहले आग लगती है, तो वह उस संदेश को पोस्ट करता है। यदि अभिभावक ऐप चल रहा है, और उपयोगिता शुरू की है, तो यह प्रतिक्रिया संदेश पोस्ट करता है, जो उपयोगिता देखता है और सब ठीक है। यदि नहीं, तो उपयोगिता का समय समाप्त हो जाता है और बाहर निकलता है।

    +0

    अभिभावक ऐप को इस तरह कार्यान्वित करने के लिए संशोधित/पुनर्लेखित करना होगा। क्या वो सही है ? – Rick

    +0

    हां। मैंने नहीं देखा कि एक तृतीय पक्ष ऐप तब तक उपयोगिता चला रहा था जब तक कि मैंने इसे लिखा नहीं था। मेरी गलती। –

    संबंधित मुद्दे