为了使Shell32工作,我应该在C#应用程序中包含哪些内容?
编辑:
我的应用程序无法识别shell32.我应该包括哪些参考或库?我想要做的是:
Shell32.Shell shell = new Shell32.Shell();
Run Code Online (Sandbox Code Playgroud)
我得到的是一个错误:
错误1找不到类型或命名空间名称"Shell32"(您是否缺少using指令或程序集引用?)
我有一个.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的线程的调用.请帮忙 :)
我试图从Windows桌面和资源管理器Windows获取所选文件的列表.要求是我应该能够从活动资源管理器窗口或桌面检索当前选择.
在完成在线资源后,我设法将以下代码放在一起,但它没有提供桌面上所选项目的列表.
ArrayList selected = new ArrayList();
var shell = new Shell32.Shell();
IntPtr handle = IntPtr.Zero;
handle = GetForegroundWindow();
int intHandle = handle.ToInt32();
//For each explorer
foreach (InternetExplorer window in new ShellWindowsClass())
{
if (window.HWND == (int)handle)
{
Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)window.Document).SelectedItems();
foreach (Shell32.FolderItem item in items)
{
selected.Add(item.Path);
}
}
}
Run Code Online (Sandbox Code Playgroud)
除此之外,我尝试了以下内容,但它只是在所有打开的资源管理器窗口中提供所有选定元素的列表,而忽略了桌面.
string filename; = Path.GetFileNameWithoutExtension(window.FullName).ToLower();
if (filename.ToLowerInvariant() == "explorer")
{
Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)window.Document).SelectedItems();
foreach (Shell32.FolderItem item in items)
{
//MessageBox.Show(item.Path.ToString());
selected.Add(item.Path);
}
}
Run Code Online (Sandbox Code Playgroud)
因此,我总是最终得到一个来自资源管理器窗口的列表,即使没有打开资源管理器窗口也没有结果.目前的技术似乎完全忽略了桌面.
如果有人可以帮助我从当前活动的窗口/桌面获取所选文件的列表,我将非常感激.
谢谢.
我需要使用Shell32解压缩我的应用程序中的一些文件.现在,我 srcFolder.CopyHere(destFolder.Items())用来实现这一目标.但是,我的下一行代码需要新制作的ZIP文件.但由于该CopyHere方法是Async,我如何检查它何时完成?现在我使用一个Thread.Sleep大约500毫秒,这足以让我的电脑完成创建ZIP文件,但它不是很好的代码imo.
有任何想法吗?
如有必要,可以提供更多信息/代码.
嗯.好的,重新访问PInvoke后,我确信我不太明白: - /(刚问过这个问题)
让我举例说明我需要处理的代码.当我使用"添加引用 - > COM - > Microsoft Shell控件和自动化"时它可以工作......但遗憾的是它在我的项目中放置了一个如下所示的引用:"C:\ Users\Tim\Documents\Visual Studio 2008 \项目\翼\ FileWing\OBJ \调试\ Interop.Shell32.dll"
我正在挖掘回收箱并寻找我想要恢复的物品.有没有办法不通过PInvoke来完成这项工作?或者获取对system32/shell32.dll的引用,它允许我在运行时使用此代码?
private void recoverRecyclerBinEntry(string fileName, int size)
{
try
{
Shell Shl = new Shell();
Folder Recycler = Shl.NameSpace(10);
// scans through all the recyclers entries till the one to recover has been found
for (int i = 0; i < Recycler.Items().Count; i++)
{
FolderItem FI = Recycler.Items().Item(i);
string FileName = Recycler.GetDetailsOf(FI, 0);
if (Path.GetExtension(FileName) == "")
FileName += Path.GetExtension(FI.Path); …Run Code Online (Sandbox Code Playgroud) 我正在尝试读取 C# 4 应用程序中所有桌面快捷方式的目标。Windows 桌面上的快捷方式可以来自多个位置,具体取决于快捷方式是为所有用户创建还是仅为当前用户创建。在这种特定情况下,我试图从公共桌面读取快捷方式,例如从 C:\Users\Public\Desktop\shortcut.lnk。
代码是这样的(路径是一个包含 lnk 文件路径的字符串):
var shell = new Shell32.ShellClass();
var folder = shell.NameSpace(Path.GetDirectoryName(path));
var folderItem = folder.ParseName(Path.GetFileName(path));
if (folderItem != null)
{
var link = (Shell32.ShellLinkObject)folderItem.GetLink;
Run Code Online (Sandbox Code Playgroud)
最后一行抛出 System.UnauthorizedAccessException,表示不允许读取快捷方式文件的内容。我已尝试在用户的私人桌面 (c:\Users\username\Desktop) 上使用快捷方式文件,效果很好。
所以,我的问题是:
(1) 为什么我的应用程序不允许 /read/ 代码中的快捷方式,当我作为用户可以清楚地阅读内容时?
(2) 有没有办法解决这个问题?也许为应用程序使用特殊的清单文件?
而且,顺便说一下,我的操作系统是 Windows 7,64 位。
好好的
-H-
有没有办法打开Windows快捷方式(.lnk文件)并更改它的目标?我找到了以下代码片段,它允许我找到当前目标,但它是一个只读属性:
Shell32::Shell^ shl = gcnew Shell32::Shell();
String^ shortcutPos = "C:\\some\\path\\to\\my\\link.lnk";
String^ lnkPath = System::IO::Path::GetFullPath(shortcutPos);
Shell32::Folder^ dir = shl->NameSpace(System::IO::Path::GetDirectoryName(lnkPath));
Shell32::FolderItem^ itm = dir->Items()->Item(System::IO::Path::GetFileName(lnkPath));
Shell32::ShellLinkObject^ lnk = (Shell32::ShellLinkObject^)itm->GetLink;
String^ target = lnk->Target->Path;
Run Code Online (Sandbox Code Playgroud)
我找不到任何改变目标的东西.我唯一的选择是创建一个新的快捷方式来覆盖当前的快捷方式吗?..如果是的话,我该怎么做?
在.NET 4.0应用程序(WPF)中,我们使用SHGetFileInfo获取目录树的shell图标.由于这在某些情况下需要相当长的时间(即对于无法访问的网络驱动器或软盘驱动器),我们希望在一个线程中执行此操作,然后在读入时更新图标.
调用基本相同,现在只是在一个线程中执行.因为有人说线程必须STA为此工作,我们使用Thread而不是ThreadPool进行测试,结果相同.使用ThreadPool也没有用.
SHGetFileInfo 成功(返回1),但结构中的hIcon成员为零.
IntPtr GetIcon(string name)
{
Shell32.SHFILEINFO shfi = new Shell32.SHFILEINFO();
uint flags = Shell32.SHGFI_ICON | Shell32.SHGFI_USEFILEATTRIBUTES | Shell32.SHGFI_SMALLICON;
Shell32.SHGetFileInfo(
name, System.IO.Directory.Exists(name) ? Shell32.FILE_ATTRIBUTE_DIRECTORY : Shell32.FILE_ATTRIBUTE_NORMAL,
ref shfi,
(uint) System.Runtime.InteropServices.Marshal.SizeOf(shfi),
flags );
return shfi.hIcon;
}
Run Code Online (Sandbox Code Playgroud)
完全相同的代码可以从GUI线程中正常工作.要使函数从单独的线程工作,或者使其在不阻塞GUI线程的情况下工作,必须做些什么?
更新:围绕这个的代码基本上是这样的:
var thread = new System.Threading.Thread(() => {
var result = GetIcon("C:\\");
// ... do something with the result
});
thread.SetApartmentState(System.Threading.ApartmentState.STA);
thread.Start();
Run Code Online (Sandbox Code Playgroud)
如果只留下线程委托中的行,它可以正常工作(当然,在GUI线程上).
更新:目前,我们只是调用SHGetFileInfo它来使其工作.这样做的好处是,原始问题(在加载所有图标之前未显示文件视图的页面)已经解决,但这意味着页面会挂起每个图标.但至少用户现在看到了一些事情正在发生.我们仍在寻找问题的实际解决方案.
既然.NET CLR 4.0支持并行(SxS)操作,现在应该可以在托管代码中编写shell扩展.我试过这个并成功编写了一个实现IPropertyStore,IInitializeWithStream和IPropertyStoreCapabilities的Property Handler.
处理程序工作正常,并在通过资源管理器浏览文件时按预期调用.它还可以在预览面板和文件属性"详细信息"面板中显示自定义属性.
但是,当我尝试在预览面板中编辑属性,然后单击"保存"时,出现"正在使用文件"错误,指出该文件在Windows资源管理器中已打开.
一些花絮:
那么我需要更改(或设置在注册表中)以使属性保存工作?
更新:
感谢Ben,我已经开始工作了."困难部分"(至少对我来说)是理解COM互操作永远不会在我的PropertyHandler上调用Dispose或Finalize.这使我处理的文件保持打开状态,直到GC运行.
幸运的是,"属性处理程序协议"的作用是,当为ReadValue()调用IInitializeWithSream.Initialize()时,streamMode是ReadOnly,当为SetValue()调用它时,streamMode是ReadWrite,并且将调用Commit()在末尾.
int IInitializeWithStream.Initialize( IStream stream, uint grfMode )
{
_stream = stream;
_streamMode = (Stgm)grfMode;
Load();
// We release here cause if this is a read operation we won't get called back,
// and our finializer isn't called.
if ( ( _streamMode & Stgm.ReadWrite ) != Stgm.ReadWrite )
{
Marshal.ReleaseComObject( _stream );
_stream = null;
}
return HResult.S_OK;
}
int IPropertyStore.Commit()
{
bool result = false;
if …Run Code Online (Sandbox Code Playgroud) 我一直在尝试查找有关存储在从 MS-Office for SharePoint 库生成的 url 快捷方式中的值的任何信息。我们正在从 Office 2007 迁移到 Office 365,并且创建这些链接的 2007 功能在 Office 365 中似乎不可用。
如果 .url 文件在另存为对话框中单击它时没有 IDList 值,它会将文件名更改为快捷方式。我尝试将 .url 更改为 .lnk 但非办公室应用程序无法处理它们。
.url 文件的内容
[InternetShortcut]
IDList=UAwHYBGLNCi66kGEieNCAsCMw0pTAMcAlzFXj9mZr5yalx2b35WYuMWYcRUY2d1VXJ1bvRHAXVmYgMEbpVmb0BiTlR3dvJ3aAgGd0BnOv8yYvZ2ausWZs92duFmLjFGAuAATAEDAAAAAAAAAAAAEAQXZh12cAgDAIAABA8uvAAAAAAAAAAgKAAAAAAAAAAAAAAAAAAAA8gPuuBAAAAAAAQHAlBQYA0GAzBAAAQBAKBQMAAAAAAAAAAAAQAQZk12cAAgNAgAAEAw7+CAAAAAAAAAAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQZAQGAtBwcAAAAUAAAAA
URL=file://blart/DavWWWRoot/teams/edms
IconFile=C:\ProgramData\Microsoft\Office\SharePointTeamSite.ico
IconIndex=0
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,9
Run Code Online (Sandbox Code Playgroud)
同一用户重新生成的文件
IDList=UAwHYBGLNCi66kGEieNCAsCMw0pTAMcAlzFXj9mZr5yalx2b35WYuMWYcRUY2d1VXJ1bvRHAXVmYgMEbpVmb0BiTlR3dvJ3aAgGd0BnOv8yYvZ2ausWZs92duFmLjFGAuAATAEDAAAAAAAAAAAAEAQXZh12cAgDAIAABA8uvAAAAAAAAAAgKAAAAAAAAAAAAAAAAAAAA0baRNAAAAAAAAQHAlBQYA0GAzBAAAQBAKBQMAAAAAAAAAAAAQAQZk12cAAgNAgAAEAw7+CAAAAAAAAAAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQZAQGAtBwcAAAAUAAAAA
Run Code Online (Sandbox Code Playgroud)
来自另一个用户的文件的值
IDList=UAwHYBGLNCi66kGEieNCAsCMw0pTAMcAlzFXj9mZr5yalx2b35WYuMWYcRUY2d1VXJ1bvRHAXVmYgMEbpVmb0BiTlR3dvJ3aAgGd0BnOv8yYvZ2ausWZs92duFmLjFGAuAATAEDAAAAAAAAAAAAEAQXZh12cAgDAIAABA8uvAAAAAAAAAAgKAAAAAAAAAAAAAAAAAAAA4BZpCAAAAAAAAQHAlBQYA0GAzBAAAQBAKBQMAAAAAAAdHBlfQAQZk12cAAgNAgAAEAw7+qXQJdJdHBlfqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQZAQGAtBwcAAAAUAAAAA
Run Code Online (Sandbox Code Playgroud)
我一直无法弄清楚如何解码这个值,或者我无法弄清楚其中存储了哪些数据。我已经阅读了许多不同的方法来使用 Windows 脚本和 shell 32 在 Powershell 和 C# 包装器中以编程方式创建快捷方式,C++ 寻找任何信息。我唯一的一线希望是 shell 链接也有一个 pidl 的项目 ID 列表,但我无法确认这是否相关。
我所知道的是,可以将 IDList 移动到另一个 .url,它会将您带到原始路径。IDList 的某些部分会根据创建它们的用户或重新创建 url 文件的时间而变化。
Internet 快捷方式 https://msdn.microsoft.com/en-us/library/bb776784(v=vs.85).aspx