让MFC程序支持右键菜单给程序传送命令行参数

时间:2022-11-05 14:32:44

                                       让MFC程序支持右键菜单给程序传送命令行参数

问题: 
1.给系统添加右键菜。 

2.选中的文件(文件夹)--右键---菜单-- 操作选中的文件(文件夹) 

3.文件名,路径等参数传递给程序。,如同winrar一样。
4.程序根据传递来的参数执行相应的模块。 


右键菜单预备知识:

注册右键弹出事件的方法,请按照以下对应关系:

\HKEY_CLASSES_ROOT\Folder\Shell          任意文件夹 
\HKEY_CLASSES_ROOT\Directory\Shell       任意目录 
\HKEY_CLASSES_ROOT\Drive\Shell           任意驱动器 
\HKEY_CLASSES_ROOT\*\Shell               任意文件 
新建一个主键,并在主键下添加一个特定主键(command),修改command的键值指到你的应用程序。

例如: 
建立\HKEY_CLASSES_ROOT\Folder\Shell\Test,将在Folder上按下右键时出现自定义的菜单 
建立\HKEY_CLASSES_ROOT\Folder\Shell\Test,并设定该主键为自定义的菜单,则将在Folder上按下右键时出现自定义的菜单菜单钮。 
建立\HKEY_CLASSES_ROOT\Folder\Shell\Test\command,并设定command"缺省"键值为"c:\tools\Test.exe" "%1",则将以Folder名为第一参数启动ATest.exe。 

让MFC程序支持右键菜单给程序传送命令行参数

   * 注意command键值的双引号不可缺省另外:

\HKEY_CLASSES_ROOT\Folder\Shellex 
\HKEY_CLASSES_ROOT\Directory\Shellex\HKEY_CLASSES_ROOT\Drive\Shellex 
\HKEY_CLASSES_ROOT\*\Shellex可以按应用程序在Registroy中的注册ID调用。这样可以调用.DLL和钩子函数。 
但建议按第一种方法调用应用程序,因为注册一个ID实在麻烦。如果你的应用程序支持DDE,你可以参考 
\HKEY_CLASSES_ROOT\Directory\Shell\Find键的设定来进行DDE设置。 

注册表中的%1为系统默认变量
%1                              表示程序操作的文件
%2                              表示系统默认的打印机
%3                              表示资料扇区
%4                               表示操作的Port 端口


解决方案

1、过手动或程序修改注册表实现

2、Windows Shell扩展接口来实现

实现方法:1、过手动或程序修改注册表实现

1、在[HKEY_CLASSES_ROOT/Directory/shell] 分支下建立一个自己命名的子键,例如:ProjTest;
2、将新建子键ProjTest下的默认键值设置为你想在文件夹右键菜单中显示的字符串,如:Test测试;
3、在刚才新建的子键ProjTest下面再新建一子键,但是名字必须是command;
4、将刚才新建子键command下面的默认键值设置为:E:/SoftWare/ProjTest.exe "%1",其中软件的路径可以根据自己的程序位置来写,但是后面的 "%1" 一定要记得加上,他代表的就是右键单击文件夹所在的路径,即我们调用 GetCommandLine 函数所获得的附加参数。

  我们右键单击某个文件夹之后,在弹出的菜单中就已经有我们添加的一项即“工程目录清理器”

5、在程序里修改 InitInstance() 函数代码如下:

  1. BOOL CProjTestApp::InitInstance()
  2. {
  3.         //省略的其他代码……;
  4.         CWinApp::InitInstance();
  5.        
  6.  //for the command line;
  7.         int argc = 0;
  8.         LPWSTR *lpszArgv = NULL;
  9.         LPTSTR szCmdLine = GetCommandLine(); //获取命令行参数;
  10.         lpszArgv = CommandLineToArgvW(szCmdLine, &argc); //拆分命令行参数字符串;
  11.         if (argc >= 2) {
  12.                 WCHAR szPath[500] = {0};
  13.                 swprintf(szPath, _T("%s%s%s"), _T("确定要操作 [ "), lpszArgv[1], _T(" ] 目录吗?")); //格式化字符串;
  14.                 if (MessageBox(NULL, szPath, _T("友情提示"), MB_OKCANCEL|MB_ICONQUESTION) ==  IDOK) { //进行删除提示;
  15.                         m_bStartFromCmd = TRUE;
  16.                         CleanStart(...); //调用CleanStart函数进行工程目录的清理工作;
  17.                 }
  18.                 return FALSE;
  19.         }
  20.         //command line end;
  21.         CProjCleanerDlg dlg;
  22.         m_pMainWnd = &dlg;
  23.         INT_PTR nResponse = dlg.DoModal();
  24.         if (nResponse == IDOK)
  25.         {
  26.         }
  27.         else if (nResponse == IDCANCEL)
  28.         {
  29.         }
  30.         return FALSE;
  31. }
实现方法:2、 Windows Shell扩展接口来实现

1.创建工程这里我用的VS2005,创建一个ATL 项目,属性不需要改,点默认的就可以了。

2.右击项目,添加,类,添加一个新ATL简单对象。

3.编辑代码,关于IShellExtInit和IContextMenu接口可以查看MSDN,上面写的很详细。

让MFC程序支持右键菜单给程序传送命令行参数// CCContextMenuExt
让MFC程序支持右键菜单给程序传送命令行参数

让MFC程序支持右键菜单给程序传送命令行参数class ATL_NO_VTABLE CCContextMenuExt :
让MFC程序支持右键菜单给程序传送命令行参数    public CComObjectRootEx<CComSingleThreadModel>,
让MFC程序支持右键菜单给程序传送命令行参数    public CComCoClass<CCContextMenuExt, &CLSID_CContextMenuExt>,
让MFC程序支持右键菜单给程序传送命令行参数    public IDispatchImpl<ICContextMenuExt, &IID_ICContextMenuExt, &LIBID_CtxMenuExtLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
让MFC程序支持右键菜单给程序传送命令行参数    public IShellExtInit,
让MFC程序支持右键菜单给程序传送命令行参数    public IContextMenu
让MFC程序支持右键菜单给程序传送命令行参数{
让MFC程序支持右键菜单给程序传送命令行参数public:
让MFC程序支持右键菜单给程序传送命令行参数    CCContextMenuExt()
让MFC程序支持右键菜单给程序传送命令行参数    {
让MFC程序支持右键菜单给程序传送命令行参数    }

让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数DECLARE_REGISTRY_RESOURCEID(IDR_CCONTEXTMENUEXT)
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数BEGIN_COM_MAP(CCContextMenuExt)
让MFC程序支持右键菜单给程序传送命令行参数    COM_INTERFACE_ENTRY(ICContextMenuExt)
让MFC程序支持右键菜单给程序传送命令行参数    COM_INTERFACE_ENTRY(IDispatch)
让MFC程序支持右键菜单给程序传送命令行参数    COM_INTERFACE_ENTRY(IShellExtInit)
让MFC程序支持右键菜单给程序传送命令行参数    COM_INTERFACE_ENTRY(IContextMenu)
让MFC程序支持右键菜单给程序传送命令行参数END_COM_MAP()
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数    DECLARE_PROTECT_FINAL_CONSTRUCT()
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数    HRESULT FinalConstruct()
让MFC程序支持右键菜单给程序传送命令行参数    {
让MFC程序支持右键菜单给程序传送命令行参数        m_hBitmap = LoadBitmap(_hInstance, MAKEINTRESOURCE(IDB_MENU));
让MFC程序支持右键菜单给程序传送命令行参数        return S_OK;
让MFC程序支持右键菜单给程序传送命令行参数    }

让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数    void FinalRelease()
让MFC程序支持右键菜单给程序传送命令行参数    {
让MFC程序支持右键菜单给程序传送命令行参数        if (m_hBitmap)
让MFC程序支持右键菜单给程序传送命令行参数        {
让MFC程序支持右键菜单给程序传送命令行参数            DeleteObject(m_hBitmap);
让MFC程序支持右键菜单给程序传送命令行参数        }

让MFC程序支持右键菜单给程序传送命令行参数    }

让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数public:
让MFC程序支持右键菜单给程序传送命令行参数    enum 
让MFC程序支持右键菜单给程序传送命令行参数    {
让MFC程序支持右键菜单给程序传送命令行参数        IDM_CTXMENU = 0,
让MFC程序支持右键菜单给程序传送命令行参数    }
;
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数public:
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数    HRESULT STDMETHODCALLTYPE Initialize( 
让MFC程序支持右键菜单给程序传送命令行参数        /* [in] */ LPCITEMIDLIST pidlFolder,
让MFC程序支持右键菜单给程序传送命令行参数        /* [in] */ IDataObject *pdtobj,
让MFC程序支持右键菜单给程序传送命令行参数        /* [in] */ HKEY hkeyProgID)
让MFC程序支持右键菜单给程序传送命令行参数    {
让MFC程序支持右键菜单给程序传送命令行参数        HRESULT hr;
让MFC程序支持右键菜单给程序传送命令行参数        UINT    nFileCount;
让MFC程序支持右键菜单给程序传送命令行参数        UINT    nLen;
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数        FORMATETC fmt = 
让MFC程序支持右键菜单给程序传送命令行参数        {
让MFC程序支持右键菜单给程序传送命令行参数            CF_HDROP,
让MFC程序支持右键菜单给程序传送命令行参数            NULL,
让MFC程序支持右键菜单给程序传送命令行参数            DVASPECT_CONTENT,
让MFC程序支持右键菜单给程序传送命令行参数            -1,
让MFC程序支持右键菜单给程序传送命令行参数            TYMED_HGLOBAL
让MFC程序支持右键菜单给程序传送命令行参数        }
;
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数        STGMEDIUM sm = 
让MFC程序支持右键菜单给程序传送命令行参数        {
让MFC程序支持右键菜单给程序传送命令行参数            TYMED_HGLOBAL
让MFC程序支持右键菜单给程序传送命令行参数        }
;
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数        hr = pdtobj->GetData(&fmt, &sm);
让MFC程序支持右键菜单给程序传送命令行参数       
让MFC程序支持右键菜单给程序传送命令行参数        if (FAILED(hr))
让MFC程序支持右键菜单给程序传送命令行参数        {
让MFC程序支持右键菜单给程序传送命令行参数            return hr;
让MFC程序支持右键菜单给程序传送命令行参数        }

让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数        nFileCount = DragQueryFile((HDROP)sm.hGlobal, 0xFFFFFFFF, NULL, 0);
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数        if (nFileCount >= 1)
让MFC程序支持右键菜单给程序传送命令行参数        {
让MFC程序支持右键菜单给程序传送命令行参数            nLen = DragQueryFile((HDROP)sm.hGlobal, 0, m_pszFileName, sizeof(m_pszFileName));
让MFC程序支持右键菜单给程序传送命令行参数            
让MFC程序支持右键菜单给程序传送命令行参数            if (nLen >0 && nLen <MAX_PATH)
让MFC程序支持右键菜单给程序传送命令行参数            {
让MFC程序支持右键菜单给程序传送命令行参数                m_pszFileName[nLen] = _T('\0');
让MFC程序支持右键菜单给程序传送命令行参数                hr = S_OK;
让MFC程序支持右键菜单给程序传送命令行参数            }

让MFC程序支持右键菜单给程序传送命令行参数            else
让MFC程序支持右键菜单给程序传送命令行参数            {
让MFC程序支持右键菜单给程序传送命令行参数                hr = E_INVALIDARG;
让MFC程序支持右键菜单给程序传送命令行参数            }
    
让MFC程序支持右键菜单给程序传送命令行参数        }

让MFC程序支持右键菜单给程序传送命令行参数        else
让MFC程序支持右键菜单给程序传送命令行参数        {            
让MFC程序支持右键菜单给程序传送命令行参数            hr = E_INVALIDARG;
让MFC程序支持右键菜单给程序传送命令行参数        }

让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数        ReleaseStgMedium(&sm);
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数        return hr;
让MFC程序支持右键菜单给程序传送命令行参数    }

让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数    STDMETHOD(QueryContextMenu)(THIS_
让MFC程序支持右键菜单给程序传送命令行参数        HMENU hmenu,
让MFC程序支持右键菜单给程序传送命令行参数        UINT indexMenu,
让MFC程序支持右键菜单给程序传送命令行参数        UINT idCmdFirst,
让MFC程序支持右键菜单给程序传送命令行参数        UINT idCmdLast,
让MFC程序支持右键菜单给程序传送命令行参数        UINT uFlags)
让MFC程序支持右键菜单给程序传送命令行参数    {
让MFC程序支持右键菜单给程序传送命令行参数        MENUITEMINFO mii;
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数        if (uFlags & CMF_DEFAULTONLY)
让MFC程序支持右键菜单给程序传送命令行参数        {
让MFC程序支持右键菜单给程序传送命令行参数            return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 0);
让MFC程序支持右键菜单给程序传送命令行参数        }

让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数        memset((void*)&mii, 0, sizeof(mii));
让MFC程序支持右键菜单给程序传送命令行参数        mii.cbSize      = sizeof(mii);
让MFC程序支持右键菜单给程序传送命令行参数        mii.fMask       = MIIM_STRING | MIIM_CHECKMARKS | MIIM_ID | MIIM_STATE;
让MFC程序支持右键菜单给程序传送命令行参数        mii.cch         = lstrlen(SZ_MENUTEXT);
让MFC程序支持右键菜单给程序传送命令行参数        mii.dwTypeData  = SZ_MENUTEXT;
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数        /*
让MFC程序支持右键菜单给程序传送命令行参数            这里用hbmpChecked而不用hbmpItem的原因
让MFC程序支持右键菜单给程序传送命令行参数            - -自己动手试试就知道了。
让MFC程序支持右键菜单给程序传送命令行参数        
*/

让MFC程序支持右键菜单给程序传送命令行参数        mii.hbmpItem
让MFC程序支持右键菜单给程序传送命令行参数        mii.hbmpChecked = m_hBitmap;
让MFC程序支持右键菜单给程序传送命令行参数        mii.hbmpUnchecked = m_hBitmap;
让MFC程序支持右键菜单给程序传送命令行参数        mii.fState      = MFS_ENABLED;
让MFC程序支持右键菜单给程序传送命令行参数        mii.wID         = idCmdFirst + indexMenu;
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数        if (!InsertMenuItem(hmenu, indexMenu, TRUE, &mii))       
让MFC程序支持右键菜单给程序传送命令行参数        {
让MFC程序支持右键菜单给程序传送命令行参数             return E_FAIL;
让MFC程序支持右键菜单给程序传送命令行参数        }

让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数        lstrcpynA(m_pszVerb, "protected_run", 32);
让MFC程序支持右键菜单给程序传送命令行参数        lstrcpynW(m_pwszVerb, L"protected_run", 32);
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数        return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, IDM_CTXMENU + 1);
让MFC程序支持右键菜单给程序传送命令行参数    }

让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数    STDMETHOD(InvokeCommand)(THIS_
让MFC程序支持右键菜单给程序传送命令行参数        LPCMINVOKECOMMANDINFO lpici)
让MFC程序支持右键菜单给程序传送命令行参数    {
让MFC程序支持右键菜单给程序传送命令行参数        BOOL fEx = FALSE;
让MFC程序支持右键菜单给程序传送命令行参数        BOOL fUnicode = FALSE;
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数        if(lpici->cbSize == sizeof(CMINVOKECOMMANDINFOEX))
让MFC程序支持右键菜单给程序传送命令行参数        {
让MFC程序支持右键菜单给程序传送命令行参数            fEx = TRUE;
让MFC程序支持右键菜单给程序传送命令行参数            if((lpici->fMask & CMIC_MASK_UNICODE))
让MFC程序支持右键菜单给程序传送命令行参数            {
让MFC程序支持右键菜单给程序传送命令行参数                fUnicode = TRUE;
让MFC程序支持右键菜单给程序传送命令行参数            }

让MFC程序支持右键菜单给程序传送命令行参数        }

让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数        if( !fUnicode && HIWORD(lpici->lpVerb))
让MFC程序支持右键菜单给程序传送命令行参数        {
让MFC程序支持右键菜单给程序传送命令行参数            if(StrCmpIA(lpici->lpVerb, m_pszVerb))
让MFC程序支持右键菜单给程序传送命令行参数            {
让MFC程序支持右键菜单给程序传送命令行参数                return E_FAIL;
让MFC程序支持右键菜单给程序传送命令行参数            }

让MFC程序支持右键菜单给程序传送命令行参数        }

让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数        else if( fUnicode && HIWORD(((CMINVOKECOMMANDINFOEX *) lpici)->lpVerbW))
让MFC程序支持右键菜单给程序传送命令行参数        {
让MFC程序支持右键菜单给程序传送命令行参数            if(StrCmpIW(((CMINVOKECOMMANDINFOEX *)lpici)->lpVerbW, m_pwszVerb))
让MFC程序支持右键菜单给程序传送命令行参数            {
让MFC程序支持右键菜单给程序传送命令行参数                return E_FAIL;
让MFC程序支持右键菜单给程序传送命令行参数            }

让MFC程序支持右键菜单给程序传送命令行参数        }

让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数        else if(LOWORD(lpici->lpVerb) != IDM_CTXMENU)
让MFC程序支持右键菜单给程序传送命令行参数        {
让MFC程序支持右键菜单给程序传送命令行参数            return E_FAIL;
让MFC程序支持右键菜单给程序传送命令行参数        }

让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数        else
让MFC程序支持右键菜单给程序传送命令行参数        {
让MFC程序支持右键菜单给程序传送命令行参数            //在此处理点击事件.
让MFC程序支持右键菜单给程序传送命令行参数
            MessageBox(NULL, m_pszFileName, _T(""), MB_OK);
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数            return S_OK;
让MFC程序支持右键菜单给程序传送命令行参数            
让MFC程序支持右键菜单给程序传送命令行参数        }

让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数        return E_FAIL;
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数    }

让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数    STDMETHOD(GetCommandString)(THIS_
让MFC程序支持右键菜单给程序传送命令行参数        UINT_PTR    idCmd,
让MFC程序支持右键菜单给程序传送命令行参数        UINT        uType,
让MFC程序支持右键菜单给程序传送命令行参数        UINT      * pwReserved,
让MFC程序支持右键菜单给程序传送命令行参数        LPSTR       pszName,
让MFC程序支持右键菜单给程序传送命令行参数        UINT        cchMax)
让MFC程序支持右键菜单给程序传送命令行参数    {
让MFC程序支持右键菜单给程序传送命令行参数        HRESULT  hr = E_INVALIDARG;
让MFC程序支持右键菜单给程序传送命令行参数        static CHAR szHelpTextA[] = "windows扩展菜单!";
让MFC程序支持右键菜单给程序传送命令行参数        static WCHAR szHelpTextW[] = L"windows扩展菜单!";
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数        if(idCmd != IDM_CTXMENU)
让MFC程序支持右键菜单给程序传送命令行参数        {
让MFC程序支持右键菜单给程序传送命令行参数            return hr;
让MFC程序支持右键菜单给程序传送命令行参数        }

让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数        switch(uType)
让MFC程序支持右键菜单给程序传送命令行参数        {
让MFC程序支持右键菜单给程序传送命令行参数        case GCS_HELPTEXTA:
让MFC程序支持右键菜单给程序传送命令行参数            lstrcpynA((CHAR*)pszName, szHelpTextA, cchMax);
让MFC程序支持右键菜单给程序传送命令行参数            break
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数        case GCS_HELPTEXTW: 
让MFC程序支持右键菜单给程序传送命令行参数            lstrcpynW((WCHAR*)pszName, szHelpTextW, cchMax);;
让MFC程序支持右键菜单给程序传送命令行参数            break
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数        case GCS_VERBA:
让MFC程序支持右键菜单给程序传送命令行参数            lstrcpynA((CHAR*)pszName, m_pszVerb, cchMax);
让MFC程序支持右键菜单给程序传送命令行参数            break
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数        case GCS_VERBW:
让MFC程序支持右键菜单给程序传送命令行参数            lstrcpynW((WCHAR*)pszName, m_pwszVerb, cchMax);
让MFC程序支持右键菜单给程序传送命令行参数            break;
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数        default:
让MFC程序支持右键菜单给程序传送命令行参数            hr = S_OK;
让MFC程序支持右键菜单给程序传送命令行参数            break
让MFC程序支持右键菜单给程序传送命令行参数        }

让MFC程序支持右键菜单给程序传送命令行参数        return hr;
让MFC程序支持右键菜单给程序传送命令行参数    }

让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数private:
让MFC程序支持右键菜单给程序传送命令行参数    TCHAR   m_pszFileName[MAX_PATH];
让MFC程序支持右键菜单给程序传送命令行参数    HBITMAP m_hBitmap;
让MFC程序支持右键菜单给程序传送命令行参数    CHAR    m_pszVerb[32];
让MFC程序支持右键菜单给程序传送命令行参数    WCHAR   m_pwszVerb[32];
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数}
;


4.修改服务注册、取消注册函数,这里只需在需要处理的文件类型的shllex下的ContextMenuHandlers下创建项,并设置接口ID。

让MFC程序支持右键菜单给程序传送命令行参数// DllRegisterServer - 将项添加到系统注册表
让MFC程序支持右键菜单给程序传送命令行参数
STDAPI DllRegisterServer(void)
让MFC程序支持右键菜单给程序传送命令行参数{
让MFC程序支持右键菜单给程序传送命令行参数    // 注册对象、类型库和类型库中的所有接口
让MFC程序支持右键菜单给程序传送命令行参数
    HRESULT hr;
让MFC程序支持右键菜单给程序传送命令行参数    HKEY hKey;
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数    static char pszGUID[] = "{C2397F2E-4BA3-4B9D-858A-F775761C023B}";
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数    hr = _AtlModule.DllRegisterServer();
让MFC程序支持右键菜单给程序传送命令行参数    if (FAILED(hr))
让MFC程序支持右键菜单给程序传送命令行参数    {
让MFC程序支持右键菜单给程序传送命令行参数        return hr;
让MFC程序支持右键菜单给程序传送命令行参数    }

让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数    if (RegCreateKeyA(HKEY_CLASSES_ROOT, 
让MFC程序支持右键菜单给程序传送命令行参数        "*\\shellex\\ContextMenuHandlers\\CtxMenu", &hKey) != ERROR_SUCCESS)
让MFC程序支持右键菜单给程序传送命令行参数    {
让MFC程序支持右键菜单给程序传送命令行参数        return E_FAIL;
让MFC程序支持右键菜单给程序传送命令行参数    }

让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数    if (RegSetValueA(hKey, NULL, REG_SZ, pszGUID,
让MFC程序支持右键菜单给程序传送命令行参数            (DWORD)strlen(pszGUID)) != ERROR_SUCCESS)
让MFC程序支持右键菜单给程序传送命令行参数    {
让MFC程序支持右键菜单给程序传送命令行参数        RegCloseKey(hKey);
让MFC程序支持右键菜单给程序传送命令行参数        return E_FAIL;
让MFC程序支持右键菜单给程序传送命令行参数    }

让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数  
让MFC程序支持右键菜单给程序传送命令行参数    return hr;
让MFC程序支持右键菜单给程序传送命令行参数}

让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数// DllUnregisterServer - 将项从系统注册表中移除
让MFC程序支持右键菜单给程序传送命令行参数
STDAPI DllUnregisterServer(void)
让MFC程序支持右键菜单给程序传送命令行参数{
让MFC程序支持右键菜单给程序传送命令行参数    RegDeleteKeyA(HKEY_CLASSES_ROOT, "*\\shellex\\ContextMenuHandlers\\CtxMenu");
让MFC程序支持右键菜单给程序传送命令行参数
让MFC程序支持右键菜单给程序传送命令行参数    return _AtlModule.DllUnregisterServer();
让MFC程序支持右键菜单给程序传送命令行参数}


5.编译运行,VS会自动替你注册,当然也可以用regsvr32 自己注册。