一个方便的打开dos窗体的组件

        作为开发人员总是要时不时使用命令行,为此用Win+R热键输入cmd的方式,然后在dos窗体通过
CD命令一步步转到命令所在目录,这系列操作多了就有点繁琐了,有没有简单的方式呢?

         网上搜了一把,有在注册表加入几项即可的办法,方法如下:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT/Directory/shell/cmd]
@="进入DOS"
[HKEY_CLASSES_ROOT/Directory/shell/cmd/command]
@="cmd.exe /k /"cd %L/""
[HKEY_CLASSES_ROOT/Drive/shell/cmd]
@="进入DOS"
[HKEY_CLASSES_ROOT/Drive/shell/cmd/command]
@="cmd.exe /k /"cd %L/""

把以上保存为reg文件,然后导入注册表中即可,刚开始用的挺欢快,省了很多事,但是用了一段时间后,还是不够爽,为何?

原来这个咚咚不能在我所浏览的当前目录的视图背景上让我进入dos,非要在目录上右键菜单才可以。

想了想看来图方便还不能图省事,只能写个简单的COM插件了,下面为插件执行效果,这下方便了。哈

 

这里好像不能上传代码,只好列出来了,主要代码如下:

atl工程

//  OpenDos.h : Declaration of the COpenDos

#ifndef __OPENDOS_H_
#define  __OPENDOS_H_

#include 
" resource.h "         //  main symbols

/////
//  COpenDos
class  ATL_NO_VTABLE COpenDos : 
    
public  CComObjectRootEx < CComSingleThreadModel > ,
    
public  CComCoClass < COpenDos,  & CLSID_OpenDos > ,
    
public  IOpenDos,
    
public  IShellExtInit,
    
public  IContextMenu
{
public:
    COpenDos()
    
{
    }


DECLARE_REGISTRY_RESOURCEID(IDR_OPENDOS)
DECLARE_NOT_AGGREGATABLE(COpenDos)

DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(COpenDos)
    COM_INTERFACE_ENTRY(IOpenDos)
    COM_INTERFACE_ENTRY(IShellExtInit)
    COM_INTERFACE_ENTRY(IContextMenu)
END_COM_MAP()

// IOpenDos
public:
    
// IShellExtInit
    STDMETHODIMP Initialize(LPCITEMIDLIST, LPDATAOBJECT, HKEY);
    
    
// IContextMenu
    STDMETHODIMP GetCommandString(UINT, UINT, UINT*, LPSTR, UINT);
    STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO);
    STDMETHODIMP QueryContextMenu(HMENU, UINT, UINT, UINT, UINT);
protected:
    TCHAR m_szFile [MAX_PATH];
}
;

#endif   // __OPENDOS_H_





//
//  OpenDos.cpp : Implementation of COpenDos
#include  " stdafx.h "
#include 
" DosHere.h "
#include 
" OpenDos.h "

/////
//  COpenDos


/////
//  COpenDos

STDMETHODIMP COpenDos::Initialize (
    LPCITEMIDLIST pidlFolder, LPDATAOBJECT pDataObj, HKEY hProgID )
{
    FORMATETC fmt 
= { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
    STGMEDIUM stg 
= { TYMED_HGLOBAL };
    HDROP     hDrop;

    
if!pDataObj )
    
{
        
if( pidlFolder )
        
{
            TCHAR tcPath[ MAX_PATH ];
            
if!SHGetPathFromIDList( pidlFolder , tcPath ))
            
{
                
return E_INVALIDARG;
            }

            
else
            
{
                lstrcpy(m_szFile, tcPath);
                
return S_OK;
            }

        }

        
else
        
{
            
return E_INVALIDARG;
        }

    }


    
// Look for CF_HDROP data in the data object.
    if ( FAILED( pDataObj->GetData ( &fmt, &stg ) ))
        
{
        
// Nope! Return an "invalid argument" error back to Explorer.
        return E_INVALIDARG;
        }


    
// Get a pointer to the actual data.
    hDrop = (HDROP) GlobalLock ( stg.hGlobal );

    
// Make sure it worked.
    if ( NULL == hDrop )
        
return E_INVALIDARG;

    
// Sanity check - make sure there is at least one filename.
    UINT uNumFiles = DragQueryFile ( hDrop, 0xFFFFFFFF, NULL, 0 );
    HRESULT hr 
= S_OK;

    
if ( 0 == uNumFiles )
        
{
        GlobalUnlock ( stg.hGlobal );
        ReleaseStgMedium ( 
&stg );
        
return E_INVALIDARG;
        }


    
// Get the name of the first file and store it in our member variable m_szFile.
    if ( 0 == DragQueryFile ( hDrop, 0, m_szFile, MAX_PATH ) )
        hr 
= E_INVALIDARG;

    GlobalUnlock ( stg.hGlobal );
    ReleaseStgMedium ( 
&stg );

    
return hr;
}


STDMETHODIMP COpenDos::QueryContextMenu (
    HMENU hmenu, UINT uMenuIndex, UINT uidFirstCmd,
    UINT uidLastCmd, UINT uFlags )
{
    
// If the flags include CMF_DEFAULTONLY then we shouldn't do anything.
    if ( uFlags & CMF_DEFAULTONLY )
        
return MAKE_HRESULT ( SEVERITY_SUCCESS, FACILITY_NULL, 0 );

    InsertMenu ( hmenu, uMenuIndex, MF_BYPOSITION, uidFirstCmd, _T(
"Open &Dos Here") );

    
return MAKE_HRESULT ( SEVERITY_SUCCESS, FACILITY_NULL, 1 );
}


STDMETHODIMP COpenDos::GetCommandString (
    UINT idCmd, UINT uFlags, UINT
*  pwReserved, LPSTR pszName, UINT cchMax )
{
USES_CONVERSION;

    
// Check idCmd, it must be 0 since we have only one menu item.
    if ( 0 != idCmd )
        
return E_INVALIDARG;

    
// If Explorer is asking for a help string, copy our string into the
    
// supplied buffer.
    if ( uFlags & GCS_HELPTEXT )
        
{
        LPCTSTR szText 
= _T("Open dos console here.");

        
if ( uFlags & GCS_UNICODE )
            
{
            
// We need to cast pszName to a Unicode string, and then use the
            
// Unicode string copy API.
            lstrcpynW ( (LPWSTR) pszName, T2CW(szText), cchMax );
            }

        
else
            
{
            
// Use the ANSI string copy API to return the help string.
            lstrcpynA ( pszName, T2CA(szText), cchMax );
            }


        
return S_OK;
        }


    
return E_INVALIDARG;
}


STDMETHODIMP COpenDos::InvokeCommand ( LPCMINVOKECOMMANDINFO pCmdInfo )
{
    
// If lpVerb really points to a string, ignore this function call and bail out.
    if ( 0 != HIWORD( pCmdInfo->lpVerb ) )
        
return E_INVALIDARG;

    
// Get the command index - the only valid one is 0.
    switch ( LOWORD( pCmdInfo->lpVerb) )
        
{
        
case 0:
            
{
            TCHAR szMsg [MAX_PATH 
+ 32];
            
            wsprintf ( szMsg, _T(
"cmd.exe /k "%c: && cd %s""), m_szFile[0],m_szFile );

            
//MessageBox ( pCmdInfo->hwnd, szMsg, _T("SimpleShlExt"),
            
//             MB_ICONINFORMATION );
            
            WinExec(szMsg,SW_SHOW);

            
return S_OK;
            }

        
break;

        
default:
            
return E_INVALIDARG;
        
break;
        }

}



////
//  DosHere.cpp : Implementation of DLL Exports.


//  Note: Proxy/Stub Information
//       To build a separate proxy/stub DLL, 
//       run nmake -f DosHereps.mk in the project directory.

#include 
" stdafx.h "
#include 
" resource.h "
#include 
< initguid.h >
#include 
" DosHere.h "

#include 
" DosHere_i.c "
#include 
" OpenDos.h "


CComModule _Module;

BEGIN_OBJECT_MAP(ObjectMap)
OBJECT_ENTRY(CLSID_OpenDos, COpenDos)
END_OBJECT_MAP()

/////
//  DLL Entry Point

extern   " C "
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID 
/*lpReserved*/ )
{
    
if (dwReason == DLL_PROCESS_ATTACH)
    
{
        _Module.Init(ObjectMap, hInstance, 
&LIBID_DOSHERELib);
        DisableThreadLibraryCalls(hInstance);
    }

    
else if (dwReason == DLL_PROCESS_DETACH)
        _Module.Term();
    
return TRUE;    // ok
}


/////
//  Used to determine whether the DLL can be unloaded by OLE

STDAPI DllCanUnloadNow(
void )
{
    
return (_Module.GetLockCount()==0? S_OK : S_FALSE;
}


/////
//  Returns a class factory to create an object of the requested type

STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID
*  ppv)
{
    
return _Module.GetClassObject(rclsid, riid, ppv);
}

/////
//  DllRegisterServer - Adds entries to the system registry

STDAPI DllRegisterServer(
void )
{
    
// registers object, typelib and all interfaces in typelib
    return _Module.RegisterServer(FALSE););//注意改为FALSE了

}


/////
//  DllUnregisterServer - Removes entries from the system registry

STDAPI DllUnregisterServer(
void )
{
    
return _Module.UnregisterServer(FALSE);//注意改为FALSE了
}





rgs文件内容:
HKCR
{
    NoRemove CLSID
    
{
        ForceRemove 
{F617AA3A-D9A7-4B09-AF59-6E036732FCD8} = s 'InterFaceCls Class'
        
{
            InprocServer32 
= s '%MODULE%'
            
{
                val ThreadingModel 
= s 'Apartment'
            }

        }

    }


  NoRemove Directory
  
{
    NoRemove shellex
    
{
      NoRemove ContextMenuHandlers
      
{
        ForceRemove OpenDosHere 
= s '{F617AA3A-D9A7-4B09-AF59-6E036732FCD8}'
      }

    }

  }


  NoRemove Folder
  
{
    NoRemove shellex
    
{
      NoRemove ContextMenuHandlers
      
{
        ForceRemove OpenDosHere 
= s '{F617AA3A-D9A7-4B09-AF59-6E036732FCD8}'
      }

    }

  }



  NoRemove Drive
  
{
    NoRemove shellex
    
{
      NoRemove ContextMenuHandlers
      
{
        ForceRemove OpenDosHere 
= s '{F617AA3A-D9A7-4B09-AF59-6E036732FCD8}'
      }

    }

  }


  NoRemove Directory
  
{
    NoRemove Background
    
{
        NoRemove shellex
        
{
          NoRemove ContextMenuHandlers
          
{
            ForceRemove OpenDosHere 
= s '{F617AA3A-D9A7-4B09-AF59-6E036732FCD8}'
          }

        }

    }

  }


}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值