2 u012741077 u012741077 于 2014.12.15 16:13 提问

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] = '\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;
} 

5个回答

devmiao
devmiao   Ds   Rxr 2014.12.15 16:18
已采纳

需要注销下才能看到效果,假使你的代码没问题的话。

u012741077
u012741077 我把explorer进程关闭后,又启动的,还是不行(┬_┬)
大约 3 年之前 回复
devmiao
devmiao   Ds   Rxr 2014.12.15 16:49
u012741077
u012741077 回复devmiao: 谢谢~问题解决了~在注册表中少注册了一个CLSID的值。。。
大约 3 年之前 回复
devmiao
devmiao 回复u012741077: win7以上有没有以管理员方式运行,你的程序是32bit,你的系统不是64bit的吧。
大约 3 年之前 回复
u012741077
u012741077 都看了,不成功。。。(┬_┬)
大约 3 年之前 回复
u012741077
u012741077   2014.12.15 16:14

求大神帮忙看看啦~~

u012741077
u012741077   2014.12.15 16:15

upupupupupupupup!!!

u012741077
u012741077   2014.12.15 16:49

自己顶自己。。。我顶!!!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!