我真的很感谢帮助。 我花了几个小时试图解决它。
我用VCPP6编写了一个小扩展(是的,我知道,不需要告诉我)在XP下使用IExtractImage在资源pipe理器中显示特定DOS文件的内容作为缩略图。 debuggingcertificate很简单 – 我closures浏览器,然后按F5键。 点击所需types的文件导致缩略图。 断点全部激活。
升级到VS2012(VS2013 Express也一样),使用IThumbnailProvider,同样的顺序也不起作用。
该程序本身的作品。 我可以在7和8.1中显示缩略图。 我不能做的是通过资源pipe理器进行debugging。 我可以使用来自SDK(ThumbnailProvider)的示例进行debugging,但不能使用Explorer。
项目设置是:
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
search每个变体,我可以梦想debuggingshell扩展,并尝试每一个可能的变化,我可以find的指导,但它仍然没有看到的断点。
该扩展现在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"); }