2014-06-24 4 views
6

का उपयोग कर NSRunning अनुप्रयोग प्राप्त करना मेरे पास AppleEventDescriptor है जहां मुझे भेजने वाले एप्लिकेशन के बंडल पहचानकर्ता को प्राप्त करने की आवश्यकता है। ऐप्पल इवेंट में typeProcessSerialNumber शामिल है जिसे ProcessSerialNumber में घुमाया जा सकता है।एक प्रक्रिया SerialNumber

समस्या यह है कि GetProcessPID() 10.9 में पदावनत किया गया था, और एक pid_t कि एक NSRunningApplication-runningApplicationWithProcessIdentifier: का उपयोग कर का दृष्टांत इस्तेमाल किया जा सकता प्राप्त करने के लिए जिस तरह से मंजूर किया जाना प्रतीत नहीं होता।

अन्य सभी विकल्प जो मैंने पाया है प्रक्रिया सभी में रहते हैं और इन्हें भी बहिष्कृत किया गया है।

क्या मुझे कुछ याद आ रही है या क्या मुझे इस बहिष्करण चेतावनी के साथ रहना है?

उत्तर

6

दोनों ब्रायन और डैनियल महान सुराग है कि मुझे सही जवाब खोजने में सहायता मिली है, लेकिन सामान उन्होंने सुझाव दिया बस थोड़ा सा था। यहां बताया गया है कि मैंने समस्या को हल करने का अंत कैसे किया।

ब्रायन बजाय सीरियल नंबर के लिए एक की एक प्रक्रिया आईडी के लिए एक एप्पल घटना वर्णनकर्ता प्राप्त करने के लिए कोड के बारे में सही था:

// get the process id for the application that sent the current Apple Event 
NSAppleEventDescriptor *appleEventDescriptor = [[NSAppleEventManager sharedAppleEventManager] currentAppleEvent]; 
NSAppleEventDescriptor* processSerialDescriptor = [appleEventDescriptor attributeDescriptorForKeyword:keyAddressAttr]; 
NSAppleEventDescriptor* pidDescriptor = [processSerialDescriptor coerceToDescriptorType:typeKernelProcessID]; 

समस्या यह है कि अगर आपको लगता है कि वर्णनकर्ता से -int32Value ले, एक 0 का मान वापस कर दिया जाता है (यानी कोई प्रक्रिया आईडी नहीं।) मुझे नहीं पता कि ऐसा क्यों होता है: सिद्धांत रूप में, pid_t और SInt32 दोनों पूर्णांक पर हस्ताक्षर किए गए हैं।

इसके बजाय, आप बाइट मूल्यों (जो थोड़ा endian जमा हो जाती है) और उन्हें एक प्रक्रिया आईडी में कास्ट करने की जरूरत है:

pid_t pid = *(pid_t *)[[pidDescriptor data] bytes]; 

उस बिंदु से, यह चल रहा है प्रक्रिया के बारे में जानकारी पाने के लिए सीधा है:

NSRunningApplication *runningApplication = [NSRunningApplication runningApplicationWithProcessIdentifier:pid]; 
NSString *bundleIdentifer = [runningApplication bundleIdentifier]; 

इसके अलावा, keySenderPIDAttr का उपयोग करने का डैनियल के सुझाव कई मामलों में काम नहीं करेगा। हमारी नई सैंडबॉक्स वाली दुनिया में, वहां संग्रहीत मूल्य /usr/libexec/lsboxd के लिए प्रक्रिया आईडी होने की संभावना है, जिसे लॉन्च सर्विसेज सैंडबॉक्स डिमन के रूप में भी जाना जाता है, न कि ईवेंट की उत्पत्ति वाले ऐप की प्रक्रिया आईडी।

इस समाधान के लिए ब्रायन और डैनियल को धन्यवाद के लिए धन्यवाद!

3

तुम इतनी तरह एक pid_t वर्णनकर्ता में ProcessSerialNumber वर्णनकर्ता अनुवाद करने के लिए उपयोग कर सकते हैं एप्पल घटना वर्णनकर्ता बलात्कार:

NSAppleEventDescriptor* processSerialDescriptor = [myEvent attributeDescriptorForKeyword:keyAddressAttr]; 
NSAppleEventDescriptor* pidDescriptor = [processSerialDescriptor coerceToDescriptorType:typeKernelProcessID]; 
pid_t pid = [pidDescriptor int32Value]; 
+2

वैकल्पिक रूप से आप प्रेषक को देखे बिना इसे पीआईडी ​​पर प्राप्त करने के लिए keySenderPIDAttr का उपयोग कर सकते हैं और इसे समन्वयित कर सकते हैं: [[event विशेषताDescriptorForKeyword: keySenderPIDAttr] int32Value] – danielpunkass

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