没有手动编写函数,可以将一些已知的REFIID转换为名称,例如:
if (riid == IID_IUnknown) return "IUnknown";
if (riid == IID_IShellBrowser) return "IShellBrowser";
...
Run Code Online (Sandbox Code Playgroud)
是否有系统调用会为众所周知的(甚至所有)REFIID返回合理的调试字符串?
基于我在超级用户处收到的答案,很明显我必须将以下内容添加到自定义资源管理器窗口启动器中.我想启动一个rooted explorer视图,只有那个窗口使导航窗格看起来像旧的Windows XP文件夹窗格.我已经编写了一个程序来在"开始"菜单上放置这些文件夹视图的快捷方式,因此更改快捷方式以通过启动程序运行是微不足道的.

Windows 7资源管理器导航窗格http://www.280z28.org/images/NavigationPaneProblems.png
我真的很喜欢KDE SC 4的氧气外观.我写了一个程序将这些图标应用到windows.该程序是用NSIS编写的,目前几乎完全正常运行.但是,我发现让Windows了解图标更改的唯一方法是杀死explorer.exe,删除图标缓存,并重新生成explorer.exe.SHChangeNotify与SHCNE_ASSOCCHANGED似乎无法使Windows知道的更改控制面板图标,我的电脑图标,等请提出一个更好的,那么残酷的方法来让Windows识别这些更改.
编辑:我发现了一个名为Icon Tweaker的程序似乎能够做到这一点,但它是封闭的来源,所以我不知道它是如何做到的.(IconTweaker:http://www.crystalxp.net/galerie/en.id.83-icontweaker.html )
编辑:感谢Anders的回复(见下文),我的工作正常.但是,我会把我工作的NSIS代码放在这里,万一其他人需要它
ReadRegStr $0 HKCU "Control Panel\Desktop\WindowMetrics" "Shell Icon Size"
IntOp $0 $0 + 1
WriteRegStr HKCU "Control Panel\Desktop\WindowMetrics" "Shell Icon Size" $0
SendMessage 0xffff 0x001A 42 0 /TIMEOUT=100000
IntOp $0 $0 - 1
WriteRegStr HKCU "Control Panel\Desktop\WindowMetrics" "Shell Icon Size" $0
SendMessage 0xffff 0x001A 42 0 /TIMEOUT=100000
Run Code Online (Sandbox Code Playgroud)
$ 0寄存器用于存储Shell Icon Size值HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics.然后我们递增值并执行a SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0, SMTO_ABORTIFHUNG, 100000, NULL),然后递减并重新发送.
编辑:作为奖励,这可以用作在Windows …
嗨,我是shell扩展的新手.我阅读了http://www.codeproject.com/KB/shell/overlayicon.aspx 文章,并能够在名称中包含字符串"sample"的文件上显示叠加图标.现在我的问题是我有一个应用程序,根据文件状态显示不同文件的不同叠加,如上传,上传,未上传等.请帮助我如何为特定路径中的特定文件/文件夹设置叠加系统.谢谢
我试图在Delphi中获取pidl形式的路径时获得访问冲突,并且返回的pidl为nil.这是我的代码:
type
// TParseDisplayName = function(pszPath: PChar; pbc: pointer; var pidl: PItemIDList; sfgaoIn: LongWord; var psfgaoOut: LongWord): LongInt;
TParseDisplayName = function(pszPath: PWideChar; pbc: IBindCtx; var pidl: PItemIDList; sfgaoIn: ULong; var psfgaoOut: ULong): HResult;
var
SHParseDisplayName: TParseDisplayName;
SHELL32DLLHandle : THandle;
procedure test();
var
ws : WideString;
tmpLongWord: ULong;
lpItemID: PItemIDList;
begin
//ws := 'Mes documents';
CoInitialize(nil);
// path to test
ws := 'C:\inetsdk\Nouveau Document WordPad.doc';
if (SHParseDisplayName(PWideChar(ws), nil, lpItemID, 0, tmpLongWord) = S_OK) then
if not assigned(lpItemID) then
s := SysErrorMessage(getLastError); …Run Code Online (Sandbox Code Playgroud) 我想创建一个上下文菜单shell扩展,以配合我用Python编写的程序.
我试图用在工作演示\Lib\site-packages\win32comext\shell\demos\servers\context_menu.py从pywin32(这里是文件),但它并没有对我的X64 Win7的工作:它注册好了,并添加注册表项,但在上下文菜单中没有出现(即使经过重启).所以我搜索了一些,并记住Dropbox说只使用Python进行开发,我查看了它们的上下文菜单注册表项.我发现他们使用:DropboxExt64.15.dll在他们中InProcServer32(虽然我已经阅读过这个和其他一些资源,但我对shell扩展还不太了解).因此看起来他们将ac/c ++代码编译为dll并使用它来调用python代码.
我的问题是他们是怎么做到的?我在哪里可以找到有关如何使用此方法的资源(示例,指南等)?使用该方法有哪些缺陷context_menu.py?
我想为Windows 8 Embedded Standard(Release Preview)创建一个自定义shell(WinForms),允许用户运行,安装或更新应用程序(可以是桌面和/或城域应用程序).
因此,我explorer.exe在注册表中替换了自定义shell的路径,这非常有效.当我尝试使用IApplicationActivationManager运行metro风格的应用程序时(请参阅此处的实现细节),我收到以下错误消息:
应用程序管理器需要激活应用程序,但未运行.(HRESULT异常:0x80270257)
事件日志不包含任何其他信息(既不在Application也不在内TWinUI).
Metro风格的应用程序在explorer.exe用作shell 时运行良好.我还没有找到一个流程或服务,我可以简单地开始允许执行metro应用程序(我试图运行WWAHost.exe,但这失败并显示错误消息The system cannot execute the specified program.).explorer.exe手动启动不会改变任何东西.
我已经在SWT中开发了一个Java应用程序,该应用程序应在作为信息亭运行的Windows系统上运行。该应用程序应该是系统中唯一运行的应用程序,并且应该在系统启动后立即打开。应该禁用任务管理器,Windows开始菜单,热键等所有功能(例如,请参见http://www.codeproject.com/Articles/7392/Lock-Windows-Desktop)。该应用程序还具有一个内置的管理员用户,该用户可以再次激活所有事情,从而有可能在系统中进行更改。这些事情已经实现。问题在于,当Windows启动时,它会持续几秒钟,直到应用程序打开为止,在此短时间内,用户会看到所有内容(直到应用程序启动,所有内容都无法禁用)。我已经搜索了互联网,唯一的解决方案似乎是替换注册表中的标准Windows Shell。现在出现了问题:
没有人知道如何编写一个用于Windows外壳是
还是您有其他想法来实现这一目标?
谢谢
C++异常不能跨越COM模块边界.
所以,假设我们在一个COM方法体中,并且调用一些C++ 潜在抛出的方法/函数(这可能因为例如使用STL类而抛出):
STDMETHODIMP CSomeComServer::DoSomething()
{
CppDoSomething(); // <--- This may throw C++ exceptions
return S_OK;
}
Run Code Online (Sandbox Code Playgroud)
Q1.上面的代码是可行的实现吗?例如,如果该代码是上下文菜单shell扩展的一部分,如果C++ CppDoSomething()函数抛出C++异常,那么Explorer会做什么?它是否捕获C++异常并卸载shell扩展?在快速失败的方法之后,它是否只是崩溃资源管理器(使用崩溃转储分析问题成为可能)?
Q2.像这样的实现会更好吗?
STDMETHODIMP CSomeComServer::DoSomething()
{
//
// Wrap the potentially-throwing C++ code call in a safe try/catch block.
// C++ exceptions are caught and transformed to HRESULTs.
//
try
{
CppDoSomething(); // <--- This may throw C++ exceptions
return S_OK;
}
//
// Map C++ std::bad_alloc exception to E_OUTOFMEMORY HRESULT.
//
catch(const std::bad_alloc& ex) …Run Code Online (Sandbox Code Playgroud) 我正在使用SHCreateItemFromParsingName将路径转换为IShellItem:
IShellItem ParseName(String path)
{
IShellItem shellItem;
HRESULT hr = SHCreateItemFromParsingName(path, null, IShellItem, out shellItem);
if (Failed(hr))
throw new ECOMException(hr);
return shellItem;
}
Run Code Online (Sandbox Code Playgroud)
注意:A
IShellItem于2006年左右推出,旨在为Windows 95时代IShellFolder+pidl构造提供方便的包装。你甚至可以问IShellItem咳嗽了它的基础IShellFolder,并pidl与IParentAndItem.GetParentAndItem接口和方法。
我可以在shell名称空间中找到一些众所周知的位置,并查看它们的绝对解析(SIGDN_DESKTOPABSOLUTEPARSING)和编辑(SIGDN_DESKTOPABSOLUTEEDITING)显示名称:
| Path | Editing | Parsing |
|-------------------|-----------------------|-------------------------------------------------------------------|
| C:\ | "C:\" | "C:\" |
| C:\Windows | "C:\Windows" | "C:\Windows" |
| Desktop …Run Code Online (Sandbox Code Playgroud)