标签: shell32

绕过 ITEMIDLIST 的 MAX_PATH 限制?

是否有任何已知的方法(无论是否记录在案或以其他方式)ITEMIDLIST从路径创建结构,例如 with ILCreateFromPath,同时绕过MAX_PATH长度限制?

shell winapi shell32 path

5
推荐指数
1
解决办法
429
查看次数

Internet 快捷方式 IDList 值解码

我一直在尝试查找有关存储在从 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

外壳链接 https://msdn.microsoft.com/en-us/library/dd891312.aspx

shell32 wsh shortcut ms-office

5
推荐指数
1
解决办法
1126
查看次数

编写Windows文件管理器应用程序的最佳编程语言

我想编写自己的文件管理器,例如XYplorer或Free Commander的功能,但功能集对程序员更有帮助.

写这篇文章的最佳语言是什么.我基本上都在寻找一种语言,它具有丰富的GUI库和Windows Shell API上的一个很好的包装库.

我尝试使用C#,但在Shell32.dll上编写我自己的PInvoke包装层是一个PITA,我希望能够超越它,以便我可以开始实际编写应用程序本身.

c# windows pinvoke winapi shell32

4
推荐指数
2
解决办法
3023
查看次数

SHChangeNotify 与 SHCNE_RMDIR 行为在 Windows 7 和 Windows 10 之间不一致

概述

我正在使用SHChangeNotifywithSHCNE_RMDIR通知 shell 已从我的shell 命名空间扩展中删除的文件夹。我的期望是,这将导致任何将其文件夹视图导航到已删除文件夹(或其任何子文件夹)的资源管理器(或其他 shell)窗口导航到已删除文件夹的父文件夹。这种预期行为发生在 Windows 10 上。但是,在 Windows 7 上,这些窗口将导航到已删除的文件夹。

问题

Windows 7 上的这种行为是否是一个错误,和/或者我可以做些什么(无需针对 Windows 7 的特殊代码)来为两个操作系统获得相同的行为?

重现问题的详细步骤

以下是如何从头开始创建和观察问题的演练。这涉及使用称为Shell 实例对象的“内置”Microsoft 命名空间扩展(而不是我真正的命名空间扩展)。我使用它是为了简单起见,也是为了表明它与我的特定命名空间扩展无关。此示例命名空间扩展所做的全部工作是在“我的电脑”下创建一个图标,该图标将浏览到您的 %TEMP% 目录。

  1. 安装命名空间扩展并在“我的电脑”下注册。为此,请在注册表中输入以下内容:

    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)

winapi shell32 shell-extensions shell-namespace-extension

4
推荐指数
1
解决办法
545
查看次数

获取Windows上任何用户的CSIDL_LOCAL_APPDATA路径

是否有任何的Win32/MFC API来获取CSIDL_LOCAL_APPDATA对于任何我想要的(不仅是当前登录的一个)的用户?假设我有"域\用户"形式的用户列表,我想获得他们的路径列表 - 这可能吗?

winapi mfc shell32 visual-c++

3
推荐指数
1
解决办法
6199
查看次数

C#Visual Studio 2008对system32.dll的引用......怎么样?

我需要参考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)

.net c# shell32

3
推荐指数
1
解决办法
3490
查看次数

如何优化Shell32方法调用?

我正在设计一个媒体播放器,我设计了一个电影课.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)

c# optimization metadata shell32

3
推荐指数
1
解决办法
3954
查看次数

如何通过CLSID在C#中实例化COM对象?

如果我的术语已经关闭,请原谅我,因为这对我来说是一个有点未知的领域.

我有一个需要创建的程序FolderShortcut.Microsoft有关于如何使用C++创建它的文档,我正在尝试将方向转换为C#.指令声明CoCreateInstance函数需要CLSID_FolderShortcut作为参数调用,我推断它意味着它实例化一个COM对象.此对象的CLSID是{0AFACED1-E828-11D1-9187-B532F1E9575D}.

我已尝试从COM选项卡添加对Shell32.dll的引用,但该FolderShortcut对象未显示在Intellisense中(可能它不在typelib中?).我也考虑过做一个DLLImport,但是,当然,这只能让我访问函数,而不是对象.

要在.Net中访问此对象,我需要做什么?

c# com pinvoke shell32

3
推荐指数
2
解决办法
1万
查看次数

如何从C#调用SHChangeNotify,无错误14007

我正在编写可以更新文件的代码(多么罕见且令人兴奋!).当文件更新后,我需要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)

c# pinvoke shell32

2
推荐指数
1
解决办法
2705
查看次数

在Windows Vista进度对话框中显示更多详细信息选项

我使用IProgressDialog接口来创建一个Windows-Vista风格的ProgressDialog,如下所示:

我的ProgressDialog

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

Windows中的ProgressDialogs

有关IProgressDialog界面是否有可能显示和使用此按钮?

最好的祝福

winapi dialog shell32 progressdialog

2
推荐指数
1
解决办法
358
查看次数