我正在尝试开发一个IThumbnailProvider在 Windows 7 中使用的。由于这个特定的缩略图也将依赖于同一目录中的一些其他文件,我需要使用除IInitializeWithStream路径以外的其他东西来使用,这是IInitializeWithItem. (或者,我可以使用IInitializeWithFile,但这显然更令人不悦。)
无论我做什么,我都无法让它发挥作用。我有微软的FileTypeVerifier.exe工具,它允许使用IInitializeWithItem,但是当资源管理器调用它时,它似乎只是尝试IInitializeWithStream过。(这是通过临时实现所述接口进行测试的,并且 Beep() 在其中消失Initialize())我忘记配置什么了吗?
简而言之:我如何让它发挥作用?
是否可以在打开某种类型的文件时执行某些代码?就我而言,我想“监听”视频文件(“.avi、mp4 等”)打开的时间(通过 Windows 文件资源管理器 shell,或者直接从视频播放器?),以便我可以存储播放视频的历史记录。
一个小时的谷歌搜索没有结果,所以我向你求助 stackoverflow。请指出我正确的方向。
谢谢。
我使用SHOpenFolderAndSelectItems来打开一个新的资源管理器窗口,显示特定位置(PIDL)。我对仅打开文件路径不感兴趣,所以我需要使用 PIDL据我所知,
但是,这有效,我对选择窗口中的任何项目都不感兴趣。如果我没有传递任何要选择的项目,则会根据文档打开父文件夹:
选择数组 apidl 中的项目计数。如果 cidl 为零,则 pidlFolder 必须指向描述要选择的单个项目的完全指定的 ITEMIDLIST。此函数打开父文件夹并选择该项目。
我怎样才能简单地打开我传递的 PIDL 指向的位置?
作为测试,我传递了一个要选择的项目,指向一个空指针。这似乎有效,但恐怕这可能会产生意想不到的副作用。这种行为似乎没有记录。有没有更好的方法来实现我想要实现的目标,或者我现在使用此函数的方式是否正确?
C:\randomname\file.txt,现在通过 PowerShell 运行以下脚本:
$shell = new-object -com shell.application
$folder = $shell.NameSpace("C:\randomname")
$folder.Items() | where {$_.Name -eq "file.txt"}
Run Code Online (Sandbox Code Playgroud)观察到没有产生输出,这是相当出乎意料的。
除了修改 Windows 设置之外,您知道如何以合理的方式解决这种情况吗?
编辑:
为防止混淆,这只是我实际问题的精简版。我使用shell.application而不是使用的原因Get-ChildItem是我的randomname文件夹实际上是压缩的,即我有randomname.zip并且我的实际代码如下所示:
$shell = new-object -com shell.application
$zip = $shell.NameSpace("C:\randomname.zip")
$folder = $zip.Items() | where {$_.Name -eq "randomname"}
$folder.GetFolder.Items() | where {$_.Name -eq "file.txt"}
Run Code Online (Sandbox Code Playgroud) 我觉得我会从了解这些功能如何工作的差异中受益匪浅,这样我就可以更好地了解何时使用每个功能。
我在使用两种不同的互操作(Excel 和 EPDM)时遇到了非常困难的时间,它们都广泛使用了弱类型参数。我一直在使用返回的对象并将它们转换为正确的类型时遇到问题(根据文档)。在浪费了大量时间之后,我发现对COM 对象使用TypeName、GetType和TypeOf 运算符会产生不同的结果,并且在不同的情况下,每一个都可能比下一个更可靠或更不可靠。
现在,在大多数情况下TypeName(),用 COM 对象确定类型似乎是最可靠的。然而,完全避免其他两个函数对我来说似乎是一种货物崇拜,除此之外,今天我遇到了一个有趣的问题,我似乎无法将对象强制转换为TypeName(). 在对该问题的评论中提出了一个有趣的概念,即实现的对象IDispatch实际上可能返回调度的接口类型名,这可以部分解释差异。
我真的很想更好地了解这些函数实际上是如何工作的,但是我在.NET ReferenceSource中迷失了方向,所以我在这个问题上提供了一个赏金,希望有人能解释这些不同的函数是如何工作的以及在什么应该使用每个上下文。
以下是使用 Excel 互操作的代码摘录。
Dim DocProps As Object
DocProps = WeeklyReports.CustomDocumentProperties 'WeeklyReports is a Workbook object
Debug.Print(DocProps Is Nothing)
Debug.Print(TypeName(DocProps))
Debug.Print(TypeOf (DocProps) Is DocumentProperties)
Debug.Print(DocProps.GetType.ToString)
Run Code Online (Sandbox Code Playgroud)
输出是:
虚假的
DocumentProperties
虚假的
System.__ComObject
我不得不清除我的 Windows 操作系统。我去检查我是否还有 ab ssh,但没有,所以我创建了一个。
完成了正确的步骤,甚至获得了代理 ID。
现在,当我尝试找到id/rsa/pubusing bash时,它告诉我没有文件或目录。
但我可以使用我的文件资源管理器找到该 ssh 文件。尝试获取ssh密钥以重新加载到我的GitHub和Heroku。
在搜索stackoverflow后,我确实找到了一篇文章,说运行命令env|grep HOME并确保HOMEDRIVE=C:设置为HOMEDRIVE=C:Users/Samson/,但我的没有。
如果这是正确的修复,我该如何设置HOMEDRIVE=C:=Users/Samson/
我在Windows 计算机
上
如果这不是正确的修复,我愿意接受建议。我对此非常陌生。

我想让我的.Net应用程序在系统托盘中显示通知.所以我想展示一个图标,任何人都可以告诉你如何做到这一点?
我得到一个字体文件的绝对PIDL命名 FontPIDL
我用这段代码打开它:var ShExeInfo:SHELLEXECUTEINFO;
begin
ZeroMemory(@ShExeInfo, SizeOf(ShExeInfo));
ShExeInfo.cbSize := SizeOf(ShExeInfo);
ShExeInfo.lpVerb := 'Open';
ShExeInfo.lpIDList := FontPIDL;
ShExeInfo.nShow := SW_SHOWNORMAL;
ShExeInfo.fMask := SEE_MASK_IDLIST;
end;
Run Code Online (Sandbox Code Playgroud)
得到一个错误: The parameter is incorrect
我想知道如何解决它?是我想念的一些参数?
更新:
我如何得到字体文件绝对PIDL:
var
psfDeskTop : IShellFolder;
psfFont : IShellFolder;
pEnumList : IEnumIdList;
pidFont : PItemIdList;
pidChild : PItemIdList;
pidAbFont : PItemIdList;
FontPath : array[0..MAX_PATH - 1] of Char;
pchEaten, dwAttributes, ItemsFetched : ULONG;
begin
FillChar(FontPath, sizeof(FontPath), #0);
SHGetSpecialFolderPath(0, FontPath, CSIDL_FONTS, False);
SHGetDesktopFolder(psfDeskTop);
psfDeskTop.ParseDisplayName(0, nil, FontPath, pchEaten, pidFont,
dwAttributes);
psfDeskTop.BindToObject(pidFont, nil, IID_IShellFolder, …Run Code Online (Sandbox Code Playgroud) 我似乎无法在MSDN中找到答案.我很好奇,如果我有这样的事情:
LPITEMIDLIST pidl = NULL;
HRESULT hr = SHParseDisplayName(L"\\\\?\\C:\\Users\\Name\\Folder", NULL, &pidl, 0, NULL);
Run Code Online (Sandbox Code Playgroud)
它HRESULT设置为失败E_INVALIDARG.如果我提供路径"C:\\Users\\Name\\Folder",那么问题就会消失,因为路径仅限于MAX_PATH字符.
这些Shell API与长Unicode路径不兼容吗?
比方说,如果我想从一个库存的Windows可执行文件中提取一个图标.我可以通过在Visual Studio中打开它来获取该图标ID:
然后我会对48x48大小的图标感兴趣:
所以我的假设是:
HICON hIcons[4];
::ExtractIconEx(L"mstsc.exe", -13011, hIcons, NULL, 4);
hIconLogo = hIcons[3];
Run Code Online (Sandbox Code Playgroud)
但是当我运行它时,该方法只返回3个图标:
其中只有一个是我需要的32x32版本.
然后我找到了我称之为ExtractAssociatedIconEx的 API:
WORD wIcnId = -13011;
WORD wIcnInd = 3;
hIconLogo = ::ExtractAssociatedIconEx(hInst, L"mstsc.exe", &wIcnInd, &wIcnId);
Run Code Online (Sandbox Code Playgroud)
但这也给了我一些我没想到的其他图标.
那么这两个API有什么区别?我做错了什么?
windows-shell ×10
winapi ×4
c++ ×3
windows ×3
com ×2
.net ×1
delphi ×1
icons ×1
node.js ×1
notifyicon ×1
powershell ×1
ssh ×1
ssh-keys ×1
system-tray ×1
thumbnails ×1
typename ×1
types ×1
vb.net ×1