EvpShell.cpp
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:3k
源码类别:

CA认证

开发平台:

Visual C++

  1. // EvpShell.cpp : Implementation of CEvpShell
  2. #include "stdafx.h"
  3. #include "Evp.h"
  4. #include "EvpShell.h"
  5. /////////////////////////////////////////////////////////////////////////////
  6. // CEvpShell
  7. HRESULT CEvpShell::Initialize ( LPCITEMIDLIST pidlFolder, LPDATAOBJECT pDataObj, HKEY hProgID ) 
  8. FORMATETC fmt = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; 
  9. STGMEDIUM stg = { TYMED_HGLOBAL };
  10. HDROP hDrop; 
  11. // 在数据对象内查找 CF_HDROP 型数据. 
  12. if ( FAILED( pDataObj->GetData ( &fmt, &stg ))) 
  13. // Nope! Return an "invalid argument" error back to Explorer.
  14. return E_INVALIDARG; 
  15. }
  16. // 获得指向实际数据的指针
  17. hDrop = (HDROP) GlobalLock ( stg.hGlobal );
  18. // 检查非NULL. 
  19. if ( NULL == hDrop ) 
  20. return E_INVALIDARG;
  21. }
  22. // 有效性检查 – 保证最少有一个文件名. 
  23. UINT uNumFiles = DragQueryFile ( hDrop, 0xFFFFFFFF, NULL, 0 ); 
  24. if ( 0 == uNumFiles )
  25. GlobalUnlock ( stg.hGlobal );
  26. ReleaseStgMedium ( &stg ); 
  27. return E_INVALIDARG; 
  28. HRESULT hr = S_OK; 
  29. // 取得第一个文件名并把它保存在类成员m_szFile 中.
  30. if ( 0 == DragQueryFile ( hDrop, 0, m_szFile, MAX_PATH ))
  31. hr = E_INVALIDARG; 
  32. GlobalUnlock ( stg.hGlobal ); 
  33. ReleaseStgMedium ( &stg ); 
  34. return hr; 
  35. }
  36. HRESULT CEvpShell::QueryContextMenu ( HMENU hMenu,UINT uMenuIndex, UINT uidFirstCmd, UINT uidLastCmd, UINT uFlags )
  37. {          
  38. // 如果标志包含 CMF_DEFAULTONLY 我们不作任何事情. 
  39. if ( uFlags & CMF_DEFAULTONLY ) 
  40. return MAKE_HRESULT ( SEVERITY_SUCCESS, FACILITY_NULL, 0 ); 
  41. }
  42. InsertMenu(hMenu, uMenuIndex, MF_BYPOSITION, uidFirstCmd, _T("MiniCA Evp")); 
  43. m_hBmp = LoadBitmap(_Module.GetModuleInstance(), MAKEINTRESOURCE(IDB_BITMAP));   
  44. SetMenuItemBitmaps(hMenu, uMenuIndex, MF_BYPOSITION, m_hBmp, m_hBmp);  
  45. return MAKE_HRESULT ( SEVERITY_SUCCESS, FACILITY_NULL, 1 );
  46. }
  47. HRESULT CEvpShell::GetCommandString( UINT idCmd, UINT uFlags,UINT* pwReserved, LPSTR pszName, UINT cchMax ) 
  48. {
  49. USES_CONVERSION; 
  50. //检查 idCmd, 它必须是0,因为我们仅有一个添加的菜单项. 
  51. if ( 0 != idCmd ) 
  52. return E_INVALIDARG; 
  53. // 如果 Explorer 要求帮助字符串,就将它拷贝到提供的缓冲区中. 
  54. if ( uFlags & GCS_HELPTEXT ) 
  55. {
  56. LPCTSTR szText = _T("用MiniCA Evp打开");              
  57. if ( uFlags & GCS_UNICODE )
  58. // 我们需要将 pszName 转化为一个 Unicode 字符串, 接着使用Unicode字符串拷贝 API. 
  59. lstrcpynW ( (LPWSTR) pszName, T2CW(szText), cchMax ); 
  60. else
  61. // 使用 ANSI 字符串拷贝API 来返回帮助字符串. 
  62. lstrcpynA ( pszName, T2CA(szText), cchMax ); 
  63. return S_OK;
  64. return E_INVALIDARG; 
  65. }
  66. HRESULT CEvpShell::InvokeCommand ( LPCMINVOKECOMMANDINFO pCmdInfo )
  67. {
  68.     // 如果lpVerb 实际指向一个字符串, 忽略此次调用并退出.
  69.     if ( 0 != HIWORD( pCmdInfo->lpVerb ))
  70.         return E_INVALIDARG;
  71.     // 点击的命令索引 – 在这里,唯一合法的索引为0.
  72.     switch ( LOWORD( pCmdInfo->lpVerb ))
  73. {
  74. case 0:
  75. {
  76.   //          TCHAR szMsg [MAX_PATH + 32];
  77.    //         wsprintf ( szMsg, _T("The selected file was:nn%s"), m_szFile );
  78.    //         MessageBox ( pCmdInfo->hwnd, szMsg, _T("SimpleShlExt"),
  79. // MB_ICONINFORMATION );
  80. ::ShellExecute(0, L"open", m_szFile, NULL, NULL, SW_SHOWNORMAL); 
  81.             return S_OK;
  82. }
  83.         break;
  84. default:
  85. return E_INVALIDARG;
  86.         break;
  87. }
  88. DeleteObject(m_hBmp);
  89. }