一個方便的打開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}'
          }

        }

    }

  }


}

 

 

 

發佈了27 篇原創文章 · 獲贊 7 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章