2013-01-27 30 views
10

Shell32とFolder.GetDetailsOf()を使用してWTVファイルからメタデータを取得する.NET 4.0ライブラリがあります。私は問題なくConsoleとWindows Formsのアプリケーションでうまく使用しました。しかし、何らかの理由で、.NET 4.0 Windowsサービスからコンポーネントを呼び出すときに、Shellクラスを開始する呼び出しでCOMエラーが発生します。.NET WindowsサービスからShell32.dllを呼び出す

ライブラリ内部失敗コード:

Shell32.Shellシェル=新しいシェル()。

エラー:

'Shell32.Shell' タイプのインタフェースにタイプ 'システム.__ ComObject' ののCOMオブジェクトをキャストすることができません。次のエラーのため、IID '{286E6F1B-7113-4355-9562-96B7E9D64C54}'のインターフェイスのCOMコンポーネントのQueryInterface呼び出しが失敗したため、この操作は失敗しました:このようなインターフェイスはサポートされていません(HRESULT:0x80004002(E_NOINTERFACE)例外) 。

アパートメントスレッド、COM相互運用機能、ダイナミック、PIA's、etc、etcなどの内容を読みました:)しかし、私が見つけたソリューションの組み合わせは問題を解決していません。 Interopを見ることができない別のスレッドからの呼び出しでなければなりません。助けてください:)

答えて

3

これは、デフォルトでは、Windowsサービスがデスクトップとやり取りする権限を持っていないという事実に関連している可能性があります。

この理論をテストするには、デスクトップの操作を可能にするために、サービスのアクセス許可を(少なくとも一時的に)再構成します。あなたが仕事にこれを得ることに成功した場合は、以下のリンクは、その

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

をやってあなたを歩く、あなたはどんなUIの相互作用を抑制していることを確認してください。それを行う方法についての情報は、この回答で提供されています:

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

+0

私はあなたに許可の問題について同意します。 +1 – FrostyFire

+0

+1ですが、[MSDN](http://msdn.microsoft.com/en-us/library/windows/desktop/ms683502%28v=vs.85%29.aspx)によると、Vista以上サービスはデスクトップと全く(直接的に、とにかく)対話できません。リンクされたページから: "**重要**サービスはWindows Vistaのようにユーザーと直接対話できません。"私はそのような場合に「デフォルトで」と言っているかどうかはわかりません。 :-) –

+0

@KenWhite:Windows 8をチェックしただけですが、このチェックボックスはまだ有効です。私は、ログインしているユーザーに属するデスクトップと対話できないことを指摘していると思います。しかし、私はその権限を持つサービスはまだ自分の*デスクトップセッションを取得すると思います。 –

0

私は、Windowsサービスを作成していると私はP /呼び出して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

にP /呼び出しのためのより詳細な情報を見つけることができる私は、コマンドラインアプリケーション(コンソール)で、つい最近、同じ問題を抱えていました。プログラムのMain()メソッドに[STAThread]属性で注釈を付ける必要があることが判明しました。また、エントリーポイントに[MTAThread]というアノテーションが付けられているのとまったく同じように、悲惨な結果に終わってしまうことも指摘されています。私はそれが助けて欲しい

関連する問題