是否有任何已知的方法(无论是否记录在案或以其他方式)ITEMIDLIST从路径创建结构,例如 with ILCreateFromPath,同时绕过MAX_PATH长度限制?
我一直在尝试查找有关存储在从 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
我想编写自己的文件管理器,例如XYplorer或Free Commander的功能,但功能集对程序员更有帮助.
写这篇文章的最佳语言是什么.我基本上都在寻找一种语言,它具有丰富的GUI库和Windows Shell API上的一个很好的包装库.
我尝试使用C#,但在Shell32.dll上编写我自己的PInvoke包装层是一个PITA,我希望能够超越它,以便我可以开始实际编写应用程序本身.
我正在使用SHChangeNotifywithSHCNE_RMDIR通知 shell 已从我的shell 命名空间扩展中删除的文件夹。我的期望是,这将导致任何将其文件夹视图导航到已删除文件夹(或其任何子文件夹)的资源管理器(或其他 shell)窗口导航到已删除文件夹的父文件夹。这种预期行为发生在 Windows 10 上。但是,在 Windows 7 上,这些窗口将导航到已删除的文件夹。
Windows 7 上的这种行为是否是一个错误,和/或者我可以做些什么(无需针对 Windows 7 的特殊代码)来为两个操作系统获得相同的行为?
以下是如何从头开始创建和观察问题的演练。这涉及使用称为Shell 实例对象的“内置”Microsoft 命名空间扩展(而不是我真正的命名空间扩展)。我使用它是为了简单起见,也是为了表明它与我的特定命名空间扩展无关。此示例命名空间扩展所做的全部工作是在“我的电脑”下创建一个图标,该图标将浏览到您的 %TEMP% 目录。
安装命名空间扩展并在“我的电脑”下注册。为此,请在注册表中输入以下内容:
HKEY_CURRENT_USER\Software\Classes\CLSID
{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}=REG_SZ_EXPAND:"My Namespace Extension"
DescriptionID=REG_DWORD:0x00000008
System.IsPinnedToNameSpaceTree=REG_DWORD:0x00000001
DefaultIcon=REG_EXPAND_SZ:"%SystemRoot%\system32\main.cpl,9"
InProcServer32=REG_EXPAND_SZ:"%SystemRoot%\system32\shdocvw.dll"
ThreadingModel=REG_SZ:"Apartment"
ShellFolder
Attributes=REG_DWORD:0x60000000
Instance
CLSID=REG_SZ:"{0AFACED1-E828-11D1-9187-B532F1E9575D}"
InitPropertyBag
Attributes=REG_DWORD:0x00000011
Target=REG_SZ_EXPAND:"%TEMP%"
Run Code Online (Sandbox Code Playgroud)
这是一个 .reg 文件,可以为您自动执行此操作:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}]
@="My Namespace Extension"
"System.IsPinnedToNameSpaceTree"=dword:00000001
"DescriptionID"=dword:00000008
[HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}\DefaultIcon]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,6d,00,61,00,\
69,00,6e,00,2e,00,63,00,70,00,6c,00,2c,00,39,00,00,00
[HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}\InProcServer32]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,73,00,68,00,\
64,00,6f,00,63,00,76,00,77,00,2e,00,64,00,6c,00,6c,00,00,00
"ThreadingModel"="Apartment"
[HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}\Instance]
"CLSID"="{0AFACED1-E828-11D1-9187-B532F1E9575D}"
[HKEY_CURRENT_USER\Software\Classes\CLSID\{0672A6D1-A6E0-40FE-AB16-F25BADC6D9E4}\Instance\InitPropertyBag]
"Attributes"=dword:00000011
"Target"=hex(2):25,00,54,00,45,00,4d,00,50,00,25,00,00,00 …Run Code Online (Sandbox Code Playgroud)是否有任何的Win32/MFC API来获取CSIDL_LOCAL_APPDATA对于任何我想要的(不仅是当前登录的一个)的用户?假设我有"域\用户"形式的用户列表,我想获得他们的路径列表 - 这可能吗?
我需要参考system32/shell32.dll,因为我使用一些shell函数来读出回收站.我尝试了"添加引用 - > COM - > Microsoft Shell控件和自动化"和"添加引用 - >浏览---> [直接转到system32/shell32.dll].两者都添加了shell32引用到我的引用但是当我查看属性时,我看到引用的路径如下所示:"C:\ Users\Tim\Documents\Visual Studio 2008\Projects\Wing\FileWing\obj\Debug\Interop.Shell32.dll" ...
我不会将此\ obj\Debug\path部署到我的安装程序.那么如何直接引用最终用户shell32.dll呢?有办法吗?为什么VS2008会创建这条奇怪的路径?我可以更改此路径,以便它不会位于这个奇怪的子文件夹中吗?
嗯.好的,重新访问PInvoke后,我确信我不太明白: - /
让我举例说明我需要处理的代码.我正在挖掘回收箱并寻找我想要恢复的物品.有没有办法不通过PInvoke来完成这项工作?
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) 我正在设计一个媒体播放器,我设计了一个电影课.Movie类有一个MovieInfo成员,它继承自MediaInfo.MediaInfo有几个属性表示Movie文件的元数据(就是你所谓的那个?),例如文件长度,文件大小,文件路径等.为了提取这些信息,我使用了Shell32.
问题是Shell32中提供的方法非常非常慢.在我的数据库中有1部电影,这不是问题,但有10部电影,它开始变得明显,有100部电影,程序加载大约需要5分钟,而且有一些情况我必须重新初始化运行期间的电影,它再次停止程序的流程.
MediaInfo构造函数调用Initialize方法:
/// <summary>
/// Initializes all the information variables of the class.
/// </summary>
private void Initialize()
{
Folder mediaFolder = Shell32Processing.GetShellFolder(this.path);
FolderItem media = Shell32Processing.GetShellFolderItem(this.path);
//initialize bit rate value
this.bitrate = mediaFolder.GetDetailsOf(media, 28);
//initialize date accessed value
this.dateAccessed = mediaFolder.GetDetailsOf(media, 5);
//initialize date created value
this.dateCreated = mediaFolder.GetDetailsOf(media, 4);
//initialize date modified value
this.dateModified = mediaFolder.GetDetailsOf(media, 3);
//initialize data rate value
this.dataRate = mediaFolder.GetDetailsOf(media, 279);
//initialize file name value
this.fileName = mediaFolder.GetDetailsOf(media, 155);
//initialize file type value …Run Code Online (Sandbox Code Playgroud) 如果我的术语已经关闭,请原谅我,因为这对我来说是一个有点未知的领域.
我有一个需要创建的程序FolderShortcut.Microsoft有关于如何使用C++创建它的文档,我正在尝试将方向转换为C#.指令声明CoCreateInstance函数需要CLSID_FolderShortcut作为参数调用,我推断它意味着它实例化一个COM对象.此对象的CLSID是{0AFACED1-E828-11D1-9187-B532F1E9575D}.
我已尝试从COM选项卡添加对Shell32.dll的引用,但该FolderShortcut对象未显示在Intellisense中(可能它不在typelib中?).我也考虑过做一个DLLImport,但是,当然,这只能让我访问函数,而不是对象.
要在.Net中访问此对象,我需要做什么?
我正在编写可以更新文件的代码(多么罕见且令人兴奋!).当文件更新后,我需要Windows资源管理器再次调用覆盖扩展,以便我总是在文件上有正确的覆盖.我想我会用一些p/invoke技巧来做这件事(看看TortoiseSVN是如何做的),但我总是得到错误14007并且无法找到原因.这是代码:
IntPtr ptr = Marshal.StringToHGlobalUni(FullName);
Shell.SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATH | SHCNF_FLUSH, ptr, IntPtr.Zero);
Win32Exception w = new Win32Exception(Marshal.GetLastWin32Error());
LOG.ErrorFormat("Error {0} calling SHChangeNotify : {1}", w.NativeErrorCode, w.Message);
Marshal.FreeHGlobal(ptr)
Run Code Online (Sandbox Code Playgroud)
Fullname是已更新文件的路径.我收到以下错误:
Error 14007 calling SHChangeNotify : The requested lookup key was not found in any active activation context
Run Code Online (Sandbox Code Playgroud)
我在这做错了什么?
仅供参考:
[DllImport("Shell32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public static extern void SHChangeNotify(HChangeNotifyEventID wEventId, HChangeNotifyFlags uFlags, IntPtr dwItem1, IntPtr dwItem2);
SHCNE_UPDATEITEM = 0x00002000
SHCNF_PATH = SHCNF_PATHW = 0x0005
SHCNF_FLUSH = 0x1000
Run Code Online (Sandbox Code Playgroud) 我使用IProgressDialog接口来创建一个Windows-Vista风格的ProgressDialog,如下所示:

在Windows资源管理器中复制,粘贴和移动文件时显示的对话框通常会提供一个"更多详细信息"按钮,提供有关当前进度的更多信息.

有关IProgressDialog界面是否有可能显示和使用此按钮?
最好的祝福