// 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] = '\0';
//由于直接使用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;
}
shell扩展注册成功,但没出现想要的效果
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
5条回答
- devmiao 2014-12-15 08:18关注
需要注销下才能看到效果,假使你的代码没问题的话。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 YoloV5 第三方库的版本对照问题
- ¥15 请完成下列相关问题!
- ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
- ¥15 求daily translation(DT)偏差订正方法的代码
- ¥15 js调用html页面需要隐藏某个按钮
- ¥15 ads仿真结果在圆图上是怎么读数的
- ¥20 Cotex M3的调试和程序执行方式是什么样的?
- ¥20 java项目连接sqlserver时报ssl相关错误
- ¥15 一道python难题3
- ¥15 牛顿斯科特系数表表示