windows-shell扩展注册成功,但没出现想要的效果

问题描述

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

windows-shell扩展注册成功,但没出现想要的效果的相关文章

【转】Windows Shell扩展编程傻瓜手册大全:上下文菜单扩展

引用自:http://blog.163.com/yesaidu@126/blog/static/51819307200861853827582/ Part I: A step-by-step tutorial on writing shell extensions 第一节:Windows shell扩展初步:上下文菜单扩展   作者:Michael Dunn 译者:yesaidu   源代码下载:1       2   目录 ● README ● 系列绪言 ● 第一部分绪言 ● 从AppWiza

VC 向windows系统菜单中添加菜单项---Windows shell扩展编程

vs2008的方法和vc6.0做法几乎一样.下面是转载一位新浪博客-丢丢的.   打开VC6,新建一个工程,选ATL COM APPWIZARD,工程名写BlogTest.然后OK.如果要用到MFC,那把Support MFC打上勾,然后按完成.     新工程生成完毕后,在Class View里根结点按右键,选New Atl Object...,再选Simple Object,在short name里填上类名(起的类型不要和工程名重了),我填Blog,其他会自动填写完毕,OK     在Blo

(C#)Windows Shell 外壳编程系列7 - ContextMenu 注册文件右键菜单

原文 (C#)Windows Shell 外壳编程系列7 - ContextMenu 注册文件右键菜单   (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-)   接上一节:(C#)Windows Shell 外壳编程系列6 - 执行   从本节起,我所要讲述的是对 Windows 系统的"Shell 扩展"."Shell 扩展"从字面上分两个部分:Shell 与 Extension.Shell 指 Windows Explorer,而Extensi

(C#)Windows Shell 外壳编程系列8 - 同后缀名不同图标?

原文 (C#)Windows Shell 外壳编程系列8 - 同后缀名不同图标? (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-)   接上一节:(C#)Windows Shell 外壳编程系列7 - ContextMenu 注册文件右键菜单   关于注册 动态库必须注册才能使用.除了使用 regasm 来注册 DLL 以外,还应该在代码中增加 RegisterServer 和 UnregisterServer 方法,以指导 DLL 注册时,在 Windows 注册表中增加什么

NET Framework 用C#创建SHELL扩展

创建 一.前言<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> .NET平台是微软公司推出的作为未来软件运行和开发的环境,C#是微软力荐的在.NET平台下开发应用软件的首选语言.本文将讨论在.NET环境下如何使用C#语言开发Windows Shell扩展问题.如今Windows家族已发展到XP世代了,想必每个程序员都对Shell Extension不会感到陌生吧,在这里我

win764位平台下,注册的shell扩展dll不起作用,如何解决?

问题描述 win764位平台下,注册的shell扩展dll不起作用,如何解决? win764位平台下,注册的shell扩展编译成64位dll经注册后可以成功注入到explorer进程,但是没有实际效果,如何解决? 解决方案 首先,你实现的所有的接口,是不是64bit的sdk提供的那些.另外,你确认你正确安装了你的扩展没有.你怎么确认它注入成功的. 解决方案二: https://code.msdn.microsoft.com/windowsapps/CppShellExtContextMenuHa

64位的Windows 7操作系统如何成功注册dll

因为某种原因,需要在win7+64位下注册dll,但是点击开始运行,输入regsvr32 aaa.dll 时,提示错误,无法注册. 因此,通过网上查找再经一翻摸索,终于找到了一个完全注册成功的方法. 一.打开c盘,用windows查找cmd.exe文件. 二.在找到的cmd.exe中点右键,选择,以管理员身份运行. 三.在打开的dos命令窗口中,输入[cd\],让当前目录显示[c:] 四.再输入[cd windows],进入[C:\WINDOWS]目录 五.再输入[cd syswow64],进入

c++-关于注册表添加右键菜单的测试。涉及Windows shell编程

问题描述 关于注册表添加右键菜单的测试.涉及Windows shell编程 关于注册表添加右键菜单的测试. 我在win7 64位 日语系统里面发现很奇怪的结论. 不知道是不是我弄错了. 1: [HKEY_CLASSES_ROOTDirectoryBackgroundshelltest] 1)右键桌面空白区域 有效果 2)右键文件夹 无效果 2 [HKEY_CLASSES_ROOTDirectoryBackgroundshellexTest] 1)右键桌面空白区域 无效果 2)右键文件夹 无效果

(C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示

原文 (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-)   接上一节:(C#)Windows Shell 外壳编程系列8 - 同后缀名不同图标?   QueryInfo扩展 活动桌面引入一项新特性,当你在某些特定对象上旋停鼠标时,工具提示将显示它们的描述.我们可以使用 QueryInfo 扩展为Shell中的其它对象提供自定义的工具提示.如下图: 事实上,这个功能实现比前两个 Shell 扩展