2013-01-27 15 views
10

W32 dosyalarından meta veriler almak için Shell32 ve Folder.GetDetailsOf() kullanan bir .NET 4.0 kitaplığım var. Sorunu olmadan Konsol ve Windows Forms uygulamaları ile başarıyla kullandım. Ancak, bazı nedenlerle, bileşeni .NET 4.0 Windows Service'ten çağırarak, Shell sınıfını başlatma çağrısı bir COM hatasına neden olur.Shell32.dll dosyasını .NET Windows Service'den Çağırma

kütüphane içinde başarısız kodu:

Shell32.Shell kabuk = yeni Shell();

hatası:

'Shell32.Shell' tür arabirim türü 'Sistem .__ comNesne' COM nesnesi döküm edilemiyor. IID '{286E6F1B-7113-4355-9562-96B7E9D64C54}' ile arabirimin COM bileşenindeki QueryInterface çağrısı, aşağıdaki hata nedeniyle başarısız olduğundan bu işlem başarısız oldu: Böyle bir arabirim desteklenmedi (HRESULT özel durum: 0x80004002 (E_NOINTERFACE)) .

Dairelerdeki Threading, COM Interops, Dynamic, PIA, vb., Vb. Dolumlarımı okudum. Ama bulduğum çözümlerin hiçbiri problemi çözmedi. Interop'u göremeyen başka bir ileti dizisinden olmalı. Yardım, lütfen :)

cevap

3

Bu durumun, varsayılan olarak bir Windows Hizmetinin masaüstüyle etkileşim kurma iznine sahip olmaması ile ilgili olabileceğinden şüpheleniyorum.

Bu teoriyi test etmek için, masaüstü etkileşimine izin vermek için hizmet izinlerinizi (en azından geçici olarak) yeniden yapılandırın. Aşağıdaki bağlantı

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

GÜNCELLEME

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

işe bu almakla başarılı olursa bunu yaparken size yürür, herhangi UI etkileşimi bastırmak emin olun. Bunun nasıl dair bilgiler bu yanıtında mevcuttur:

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

+0

İzin sorunu konusunda size katılıyorum. +1 – FrostyFire

+0

+1, ancak [MSDN] 'ye göre (http://msdn.microsoft.com/en-us/library/windows/desktop/ms683502%28v=vs.85%29.aspx), Vista ve üstü Hizmetler hiç masaüstüyle etkileşime giremez (her halükarda). Bağlantılı sayfadan: "** Önemli ** Hizmetler, Windows Vista'dan biriyle doğrudan etkileşim kuramıyor." Bu durumda "varsayılan olarak" diyeceğimden emin değilim. :-) –

+0

@KenWhite: Sadece Windows 8'i işaretlediniz ve etkileşime izin veren onay kutusu hala var. Oturum açmış olan kullanıcıya ait olan masaüstüyle etkileşime girememek anlamına gelir. Ancak, bu izin ile hizmetlerin hala kendi * masaüstü oturumunu aldığını düşünüyorum. –

0

Bir Windows hizmeti oluşturduk ve ben P/Invoke ile Shell32 aradı.

[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); 

Ve de: Ben kullanıcı (değil Sistemi) Masaüstü ile etkileşim gibi bir süreç oluşturmak için gereken

İlk: Benim durumumda

, bu dosya üzerinde sağ tıklayıp simüle etmek oldu Bu süreç, ben

[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); 

Benim Windows Hizmet bununla Shell32 ait değişik değerleri bulmak ve bizim gibi masaüstü ile etkileşime girebilir (yük ardından değeri ayıklamak) Shell32 Kütüphanesi kullanılan er ;-)

Benim bir komut satırı uygulaması (konsol) ile sadece son zamanlarda aynı problem vardı bu website

14

P/Invoke fazla ayrıntı bulabilirsiniz.Çıktığında, programın Main() yöntemiyle [STAThread] özniteliğine açıklama yapılması gerekiyordu. Giriş noktasının bunun yerine [MTAThread] ile açıklanması durumunda, aynı şekilde mutsuz bir şekilde başarısız olduğu da not edilmiştir. Umut ediyorum bu yardım eder.