2013-01-27 15 views
10

से Shell32.dll को कॉल करना मेरे पास एक .NET 4.0 लाइब्रेरी है जो WTV फ़ाइलों से मेटाडेटा प्राप्त करने के लिए Shell32 और Folder.GetDetailsOf() का उपयोग करती है। मैंने इसे बिना किसी समस्या के कंसोल और विंडोज फॉर्म ऐप्स के साथ सफलतापूर्वक उपयोग किया है। लेकिन किसी कारण से, .NET 4.0 विंडोज सेवा से घटक को कॉल करते समय, शैल क्लास को शुरू करने के लिए कॉल COM COM का कारण बनता है।.NET विंडोज सेवा

कोड है कि पुस्तकालय के अंदर विफल रहता है:

Shell32.Shell खोल = नया शैल();

त्रुटि:

प्रकार 'सिस्टम .__ ComObject' की COM वस्तु कास्ट करने के लिए प्रकार इंटरफेस करने 'Shell32.Shell' में असमर्थ। यह ऑपरेशन विफल हुआ क्योंकि आईआईडी '{286E6F1B-7113-4355-9562-96B7E9D64C54}' के साथ इंटरफ़ेस के लिए COM घटक पर क्वेरी इंटरफ़ेस कॉल निम्न त्रुटि के कारण विफल रहा: ऐसा कोई इंटरफ़ेस समर्थित नहीं है (HRESULT: 0x80004002 (E_NOINTERFACE) से अपवाद) ।

मैंने अपार्टमेंट थ्रेडिंग, कॉम इंटरप्स, डायनामिक, पीआईए, आदि इत्यादि भरने को पढ़ा :) लेकिन मुझे मिले समाधानों का कोई संयोजन समस्या हल नहीं कर पाया है। यह एक और धागे से एक कॉलिंग होना चाहिए जो इंटरऑप नहीं देख सकता है। सहायता, कृपया :)

उत्तर

3

मुझे संदेह है कि यह इस तथ्य से संबंधित हो सकता है कि, डिफ़ॉल्ट रूप से, एक विंडोज सेवा को डेस्कटॉप से ​​बातचीत करने की अनुमति नहीं है।

उस सिद्धांत का परीक्षण करने के लिए, डेस्कटॉप इंटरैक्शन की अनुमति देने के लिए आपकी सेवा अनुमतियों को पुन: कॉन्फ़िगर करें (कम से कम अस्थायी आधार पर)। नीचे दिए गए लिंक कर कि

https://superuser.com/questions/415204/how-do-i-allow-interactive-services-in-windows-7

अद्यतन

The Shell32 functionality works just fine as LocalSystem, even when the "Allow service to interact with desktop" checkbox is unchecked, but doesn't seem to work at all under a specific user account (whether limited or admin)

Using SHFileOperation within a Windows service

आप काम करने के लिए इस प्राप्त करने में सफल हो, तो आप के माध्यम से चलता है, यह सुनिश्चित करें कि आप किसी भी UI इंटरैक्शन को दबाने बनाते हैं। कि कैसे करना है के बारे में जानकारी इस उत्तर में उपलब्ध है:

https://stackoverflow.com/a/202519/141172

+0

मैं अनुमति समस्या के बारे में आपसे सहमत हूं। +1 – FrostyFire

+0

+1, लेकिन [एमएसडीएन] के अनुसार (http://msdn.microsoft.com/en-us/library/windows/desktop/ms683502%28v=vs.85%29.aspx), Vista और उच्चतर में सेवाएं बिल्कुल डेस्कटॉप से ​​बातचीत नहीं कर सकती हैं (सीधे, वैसे भी)। लिंक किए गए पेज से: "** महत्वपूर्ण ** सेवाएं विंडोज विस्टा के रूप में सीधे उपयोगकर्ता के साथ बातचीत नहीं कर सकती हैं।" मुझे यकीन नहीं है कि मैं उस मामले में "डिफ़ॉल्ट रूप से" कहूंगा। :-) –

+0

@ केनहाइट: बस विंडोज 8 की जांच की, और यह जांच बॉक्स अभी भी वहां मौजूद है। मुझे लगता है कि लॉग-इन उपयोगकर्ता से संबंधित डेस्कटॉप से ​​बातचीत करने में सक्षम नहीं है। हालांकि, मुझे लगता है कि उस अनुमति के साथ सेवाओं को अभी भी अपना * डेस्कटॉप सत्र मिलता है। –

0

मैं एक Windows सेवा बनाया है और मैं पी/आह्वान के साथ Shell32 कहा जाता है।

मेरे मामले में, यह फ़ाइल पर राइट क्लिक अनुकरण करने के लिए किया गया था:

[DllImport("advapi32.dll", SetLastError=true, CharSet=CharSet.Auto)] 
static extern bool CreateProcessAsUser(
    IntPtr hToken, 
    string lpApplicationName, 
    string lpCommandLine, 
    ref SECURITY_ATTRIBUTES lpProcessAttributes, 
    ref SECURITY_ATTRIBUTES lpThreadAttributes, 
    bool bInheritHandles, 
    uint dwCreationFlags, 
    IntPtr lpEnvironment, 
    string lpCurrentDirectory, 
    ref STARTUPINFO lpStartupInfo, 
    out PROCESS_INFORMATION lpProcessInformation); 

और में:

पहले, मैं के रूप में उपयोगकर्ता (नहीं सिस्टम) डेस्कटॉप के साथ बातचीत करने के लिए एक प्रक्रिया बनाने की जरूरत इस प्रक्रिया में, मैं Shell32 लाइब्रेरी का इस्तेमाल किया (लोड तो मान प्राप्त)

[DllImport("kernel32.dll")] 
private static extern IntPtr LoadLibrary(string dllName); 
[DllImport("user32.dll", CharSet = CharSet.Auto)] 
static extern int LoadString(IntPtr hInstance, uint uID, StringBuilder lpBuffer, int nBufferMax); 

मेरे Windows सेवा Shell32 के विभिन्न मूल्यों इस के साथ खोजने के लिए और हमारे जैसे डेस्कटॉप के साथ बातचीत कर सकते हैं एर ;-)

आप इस website

14

मैं एक कमांड लाइन आवेदन (कंसोल) के साथ अभी हाल ही में एक ही समस्या थी पर पी/आह्वान के लिए और अधिक जानकारी प्राप्त कर सकते हैं।बाहर निकलता है, [STAThread] विशेषता के साथ प्रोग्राम की Main() विधि को एनोटेट करना आवश्यक था। यह भी ध्यान दिया गया है कि अगर प्रविष्टि बिंदु [MTAThread] के साथ एनोटेट किया गया है तो यह वैसे ही खराब तरीके से विफल हो जाता है। मुझे उम्मीद है यह मदद करेगा।