我会真诚地感激帮助与此有关。 我花了几个小时试图解决它。
我写了一个小的扩展与VCPP6(是的,我知道。没有必要告诉我)来显示特定的DOS文件的内容,在XP下使用IExtractImage在资源管理器中的缩略图。 调试证明容易 - 我关闭资源管理器,然后按F5。 单击所需的类型的文件产生了一个缩略图。 断点所有活动。
升级到VS2012(同样的情况,与VS2013快递),并使用IThumbnailProvider,相同的序列不起作用。
该程序本身的工作原理。 我可以显示在两个7和8.1缩略图。 我不能做的是通过浏览器进行调试。 我可以用一个样品从SDK(ThumbnailProvider),但浏览器进行调试。
项目设置为:
Debugging->Command: C:\Windows\explorer.exe
Debugging->Command Arguments: /e,/select,F:\NewWork\NSD-24kW\pcb\15300003.pcb
Debugging->Working Directory: $(ProjectDir) (I've tried $(OutDir) too)
Debugging->Attach: No (I've tried 'yes' too)
Debugging->Debugger Type: Native Only
Debugging->Environment: (not set)
Debugging->Merge Environment: Yes
搜索到所有的情况我能想到的调试外壳扩展,并试图在指导我能找到的每一个可能的变化,但它仍然没有看到断点。
扩展现在probaby不是explorer.exe的托管,但在DLLHOST.EXE(Windows的一项功能,从一个重要的Windows进程隔离可能马车扩展)。
你可以将其配置为托管与explorer.exe的进程内缓解调试,记录在这里: C ++ Windows Shell中的缩略图处理器(CppShellExtThumbnailHandler)
调试缩略图处理程序有以下几个原因是困难的。
1)Windows资源管理器主机缩略图提供商在一个孤立的过程中获得的鲁棒性和提高安全性。 正因为如此,很难调试处理程序,因为它没有加载那里你不能在Explorer.exe进程设置你的代码中设置断点。 分离的过程是DLLHOST.EXE并且这被用于其它目的,所以寻找该过程的正确实例是困难的。
2)一旦缩略图被计算为它缓存一个特定的文件,你的处理器将不会再针对该项目,除非你通过更新文件的修改日期无效缓存调用。 需要注意的是这个缓存的工程,即使文件被重命名或移动。
考虑到所有这些问题进行调试在测试应用程序代码那么最简单的方法,一旦你已经证明了它在那里工作在浏览器的情况下进行测试。
这样做的另一件事是关闭资源管理器的进程隔离功能。 您可以通过将下面的命名值的处理程序的CLSID做到这一点
HKCR \ CLSID {处理程序的CLSID}
DisableProcessIsolation=REG_DWORD:1
一定要与这个船舶您的处理程序,客户需要隔离的工艺特征的安全性和稳健性的好处。
你可以写一个小程序,从这个DLL文件中创建一个缩略图。 这个程序可以很容易地在调试器下运行。
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <ObjBase.h>
#include <Shlwapi.h>
#include <Thumbcache.h>
#include <Unknwn.h>
#include <stdio.h>
#pragma comment(lib, "Shlwapi.lib")
#pragma comment(lib, "Ole32.lib")
// Our GUID here:
LPCOLESTR myGuid = L"{9B083210-C856-48C0-8E8A-D9367301F046}";
typedef HRESULT ourDllGetClassObjectT(REFCLSID rclsid, REFIID riid, void **ppv);
int main(int c, char **v)
{
GUID clsid = {0};
IIDFromString(myGuid, &clsid);
if (c < 3) { printf("not enough arguments: dll image\n"); return 1; }
HRESULT r;
IStream* pStream = NULL;
HMODULE dll = NULL;
dll = LoadLibraryA(v[1]);
if (!dll) { printf("can't open DLL\n"); return 1; }
ourDllGetClassObjectT *ourDllGetClassObject = (ourDllGetClassObjectT*) GetProcAddress(dll, "DllGetClassObject");
IClassFactory *pFactory = NULL;
r = ourDllGetClassObject(clsid, IID_IClassFactory , (void**) &pFactory);
if (r != S_OK) { printf("failed: get factory: %08x\n", r); return 2; }
IInitializeWithStream *pInit;
r = pFactory->CreateInstance(NULL, IID_IInitializeWithStream, (void**) &pInit);
if (r != S_OK) { printf("failed: get object\n"); return 3; }
pFactory->Release();
IThumbnailProvider *pProvider;
r = pInit->QueryInterface(IID_IThumbnailProvider, (void**) &pProvider);
if (r != S_OK) { printf("failed: get provider\n"); return 5; }
wchar_t wfile[256] = {0};
MultiByteToWideChar(CP_ACP, 0, v[2], -1, wfile, 256);
r = SHCreateStreamOnFileEx(wfile, STGM_READ, 0, FALSE, NULL, &pStream);
if (r != S_OK || !pStream) { printf("can't open file\n"); return 10; }
r = pInit->Initialize(pStream, 0);
pInit->Release();
pStream->Release();
if (r != S_OK) { printf("failed: init provider\n"); return 11; }
HBITMAP bmp;
WTS_ALPHATYPE alpha;
r = pProvider->GetThumbnail(256, &bmp, &alpha);
pProvider->Release();
if (r != S_OK) { printf("failed: make thumbnail\n"); return 12; }
printf("done");
}