2013-01-27 11 views
10

Mam bibliotekę .NET 4.0, która używa Shell32 i Folder.GetDetailsOf() do pobierania metadanych z plików WTV. Użyłem go z powodzeniem w aplikacjach Console i Windows Forms bez problemu. Ale z jakiegoś powodu, wywołując komponent z usługi .NET 4.0 systemu Windows, wywołanie zainicjowania klasy powłoki powoduje błąd COM.Wywołanie powłoki Shell32.dll z usługi .NET systemu Windows

kod, który nie wewnątrz Biblioteka:

Shell32.Shell powłoki = nowa powłoka();

Błąd:

Nie można rzutować obiektu COM typu 'system .__ ComObject' do interfejsu typu 'Shell32.Shell'. Ta operacja nie powiodła się, ponieważ wywołanie QueryInterface na komponencie COM interfejsu z IID "{286E6F1B-7113-4355-9562-96B7E9D64C54}" nie powiodło się z powodu następującego błędu: Brak takiego interfejsu obsługiwanego (Wyjątek od HRESULT: 0x80004002 (E_NOINTERFACE)) .

Przeczytałem moje wypełnienie mieszkania wątków, COM Interops, Dynamic, PIA, itp., Itp. Ale żadna kombinacja rozwiązań, które znalazłem, nie rozwiązała problemu. To musi być połączenie z innego wątku, który nie widzi Interopu. Pomoc, proszę :)

Odpowiedz

3

Podejrzewam, że może to być związane z tym, że domyślnie usługa systemu Windows nie ma uprawnień do interakcji z pulpitem.

Aby przetestować tę teorię, przeprowadź rekonfigurację (przynajmniej tymczasowo) uprawnień do usługi, aby umożliwić interakcję z komputerem. Poniższy link prowadzi przez robi, że

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

UPDATE

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

Jeżeli uda się to do pracy, upewnij się, że tłumią interakcji UI. Informacje o tym, jak to zrobić jest dostępny w tej odpowiedzi:

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

+0

Zgadzam się z Państwem w sprawie problemu z pozwoleniem. +1 – FrostyFire

+0

+1, ale zgodnie z [MSDN] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms683502%28v=vs.85%29.aspx), w systemie Vista i nowszym usługi nie mogą w ogóle wchodzić w interakcje z pulpitem (bezpośrednio, tak czy inaczej). Ze strony połączonej: "** Ważne ** Usługi nie mogą bezpośrednio wchodzić w interakcję z użytkownikiem od wersji Windows Vista.". Nie jestem pewien, czy powiedziałbym "domyślnie" w takim przypadku. :-) –

+0

@KenWhite: Właśnie sprawdziłem Windows 8 i to pole wyboru, aby umożliwić interakcję nadal tam jest. Myślę, że to oznacza brak możliwości interakcji z pulpitem należącym do zalogowanego użytkownika. Sądzę jednak, że usługi z tym uprawnieniem nadal mają swoją * własną * sesję pulpitu. –

0

Stworzyłem usługa Windows i zadzwoniłem shell32 z P/Invoke.

W moim przypadku to było symulowanie prawym przyciskiem myszy na pliku:

Najpierw trzeba utworzyć proces jako użytkownik (nie System) do interakcji z pulpitem:

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

aw proces ten, użyłem Bibliotekę shell32 (obciążenie następnie wyodrębnić wartość)

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

My usług systemu Windows można znaleźć differents wartości shell32 z tym i interakcji z pulpitem jak my er ;-)

można znaleźć więcej szczegółów dla P/Invoke na tej website

14

miałem ten sam problem niedawno z aplikacji wiersza poleceń (konsoli).Okazuje się, że konieczne było dodanie adnotacji do metody programu Main() z atrybutem [STAThread]. Zauważono również, że nie udaje się to w ten sam sposób, jeśli punkt wejścia jest opatrzony komentarzem z [MTAThread]. Mam nadzieję, że to pomoże.

Powiązane problemy