从.NET Windows服务调用Shell32.dll

Ric*_*rin 10 .net c# com multithreading shell32

我有一个.NET 4.0库,它使用Shell32和Folder.GetDetailsOf()从WTV文件中获取元数据.我已成功使用它与控制台和Windows窗体应用程序没有问题.但由于某种原因,从.NET 4.0 Windows服务调用组件时,启动Shell类的调用会导致COM错误.

库中失败的代码:

Shell32.Shell shell = new Shell();

错误:

无法将"System .__ ComObject"类型的COM对象强制转换为接口类型"Shell32.Shell".此操作失败,因为对IID为"{286E6F1B-7113-4355-9562-96B7E9D64C54}"的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口(HRESULT异常:0x80004002(E_NOINTERFACE)) .

我阅读了我的公寓线程,COM Interops,动态,PIA等等,但是我找到的解决方案没有解决问题.它必须是来自另一个无法看到Interop的线程的调用.请帮忙 :)

Lea*_*dro 14

最近我使用命令行应用程序(控制台)遇到了同样的问题.事实证明,需要Main()使用[STAThread]属性注释程序的方法.还注意到,如果以[MTAThread]相反的方式注释入口点,则它以完全相同的方式失败.我希望它有所帮助.


Eri*_* J. 3

我怀疑这可能与默认情况下 Windows 服务没有与桌面交互的权限有关。

要测试该理论,请重新配置(至少暂时)您的服务权限以允许桌面交互。以下链接将引导您完成此操作

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

更新

即使未选中“允许服务与桌面交互”复选框,Shell32 功能也可以像 LocalSystem 一样正常工作,但在特定用户帐户(无论是受限帐户还是管理员帐户)下似乎根本不起作用

在 Windows 服务中使用 SHFileOperation

如果您成功地使其发挥作用,请确保抑制任何 UI 交互。有关如何执行此操作的信息可在此答案中找到:

/sf/answers/14176361/