问题描述
- shell扩展注册成功,但没出现想要的效果
-
// FileTimeShlExt.cpp : CFileTimeShlExt 的实现 #include "stdafx.h" #include "FileTimeShlExt.h" # pragma comment(lib, "Comctl32.lib") // CFileTimeShlExt BOOL static CALLBACK ProPageDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); UINT static CALLBACK PropPageCallbackProc(HWND hwnd, UINT uMsg, LPPROPSHEETPAGE ppsp); //初始化 HRESULT CFileTimeShlExt::Initialize(LPCITEMIDLIST pidFolder, LPDATAOBJECT pDataObj, HKEY hProgID) { TCHAR szFile[MAX_PATH]; UINT uNumFiles; HDROP hdrop; FORMATETC etc = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; STGMEDIUM stg; INITCOMMONCONTROLSEX iccex = { sizeof(INITCOMMONCONTROLSEX), ICC_DATE_CLASSES }; //初始化通用控件使用 InitCommonControlsEx(&iccex); //从数据对象中读取项目,它们以HDOP格式存放,因此只需获得HDROP句柄并对它们使用拖放APIS if (FAILED(pDataObj ->GetData(&etc, &stg))) { return E_INVALIDARG; } //获取HDROP句柄 hdrop = (HDROP)GlobalLock(stg.hGlobal); if (NULL == hdrop) { ReleaseStgMedium(&stg); return E_INVALIDARG; } //判断操作涉及几个文件 uNumFiles = DragQueryFile(hdrop, 0xFFFFFFFF, NULL, 0); //循环列举所选择的文件,该扩展将只对文件进行操作,对文件夹不起作用,所以忽略文件夹 for (UINT uFile = 0; uFile < uNumFiles; uFile++) { //取得下一文件名 if (0 == DragQueryFile(hdrop, uFile, szFile, MAX_PATH)) { continue; } //跳过文件夹,也可以处理文件夹 if (PathIsDirectory(szFile)) { continue; } //添加文件名到我们的文件名列表中。 m_lsFiles.push_back(szFile); } //释放资源 GlobalUnlock(stg.hGlobal); ReleaseStgMedium(&stg); //检查有几个文件被选中,如果大于属性表能有的最大属性页的个数,删减列表 if (m_lsFiles.size() > MAXPROPPAGES) { m_lsFiles.resize(MAXPROPPAGES); } //如果我们发现可以操作的任一文件返回S_OK,否则返回E_FAIL return (m_lsFiles.size() > 0) ? S_OK : E_FAIL; } HRESULT CFileTimeShlExt::AddPages(LPFNADDPROPSHEETPAGE lpfnAddPageProc, LPARAM lParam) { PROPSHEETPAGE psp; TCHAR szPageTitle[MAX_PATH]; string_list::const_iterator it, itEnd; for (it = m_lsFiles.begin(), itEnd = m_lsFiles.end(); it != itEnd; it++) { //it 指向下一个文件名,分配一个给页面使用弄个的字符串拷贝 LPCTSTR szFile = _tcsdup(it->c_str()); //从文件名中截去路径和扩张名,用其作为页面标题,该名称截取为24个字符以适合Tab的大小 lstrcpy(szPageTitle, it->c_str()); PathStripPath(szPageTitle); PathRemoveExtension(szPageTitle); szPageTitle[24] = ''; //由于直接使用SDK调用完成属性页,我们得亲自处理PROPSHEETPAGE结构 psp.dwSize = sizeof(PROPSHEETPAGE); psp.dwFlags = PSP_USEREFPARENT | PSP_USETITLE | PSP_DEFAULT | PSP_USEHICON | PSP_USECALLBACK; psp.hInstance = _pModule->GetModuleInstance(); psp.pszTemplate = MAKEINTRESOURCE(IDD_PROPPAGE); psp.pszIcon = MAKEINTRESOURCE(IDC_ICON); psp.pszTitle = szPageTitle; psp.pfnDlgProc = (DLGPROC)ProPageDlgProc; psp.lParam = (LPARAM)szFile; psp.pfnCallback = PropPageCallbackProc; psp.pcRefParent = (UINT *)_pModule->GetModuleInstance(); HPROPSHEETPAGE hPage = CreatePropertySheetPage(&psp); if (NULL != hPage) { //调用Shell的回调函数添加新创建的属性页到属性对话框中 if (!lpfnAddPageProc(hPage, lParam)) { DestroyPropertySheetPage(hPage); } } } return S_OK; } BOOL CALLBACK ProPageDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_BUTTON: MessageBox(NULL, L"您点击了第一个按钮。", L"提示", MB_OK); break; } break; } return TRUE; } UINT CALLBACK PropPageCallbackProc(HWND hwnd, UINT uMsg, LPPROPSHEETPAGE ppsp) { if (PSPCB_RELEASE == uMsg) { free((void *)ppsp->lParam); } return 1; }
解决方案
需要注销下才能看到效果,假使你的代码没问题的话。
解决方案二:
那你可以下载http://www.codeproject.com/KB/shell/ http://blog.163.com/yesaidu@126/blog/static/518193072008624507764/这个现成的代码看看
解决方案三:
求大神帮忙看看啦~~
解决方案四:
upupupupupupupup!!!
解决方案五:
自己顶自己。。。我顶!!!
时间: 2024-09-19 08:57:09