AdfView.cpp
上传用户:hy_wanghao
上传日期:2007-01-08
资源大小:279k
文件大小:5k
源码类别:

Shell编程

开发平台:

Visual C++

  1. // AdfView.cpp : ADF View Shell namespace extension
  2. //
  3. // Written by Bjarke Viksoe (bjarke@viksoe.dk)
  4. // Copyright (c) 2001 Bjarke Viksoe.
  5. //
  6. // Beware of bugs.
  7. //
  8. // ADF View - ADF Shell Namespace Extension
  9. // Copyright(C) 2001 Bjarke Viksoe
  10. //
  11. // This program is free software; you can redistribute
  12. // it and/or modify it under the terms of the GNU General 
  13. // Public License as published by the Free Software Foundation; 
  14. // either version 2 of the License, or (at your option) any 
  15. // later version. 
  16. // This program is distributed in the hope that it will be useful, 
  17. // but WITHOUT ANY WARRANTY; without even the implied 
  18. // warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
  19. // See the GNU General Public License for more details. 
  20. //
  21. #include "stdafx.h"
  22. #include "resource.h"
  23. #include <initguid.h>
  24. CAdfShellModule _Module;
  25. const CLSID CLSID_Folder =      {0x2B3256E4,0x49DF,0x11D3,{0x82,0x29,0x00,0x80,0xAE,0x50,0x90,0x54}};
  26. const CLSID CLSID_View =        {0x2B3256E4,0x49DF,0x11D3,{0x82,0x29,0x00,0x80,0xAE,0x50,0x90,0x55}};
  27. const CLSID CLSID_VolumeDlg =   {0x2B3256E4,0x49DF,0x11D3,{0x82,0x29,0x00,0x80,0xAE,0x50,0x90,0x56}};
  28. const CLSID CLSID_Drive =       {0x2B3256E4,0x49DF,0x11D3,{0x82,0x29,0x00,0x80,0xAE,0x50,0x90,0x57}};
  29. const CLSID CLSID_DropHandler = {0x2B3256E4,0x49DF,0x11D3,{0x82,0x29,0x00,0x80,0xAE,0x50,0x90,0x58}};
  30. #include "Folder.h"
  31. #include "View.h"
  32. #include "VolumeDlg.h"
  33. #include "DropHandler.h"
  34. #include "ShellNewDlg.h"
  35. BEGIN_OBJECT_MAP(ObjectMap)
  36. OBJECT_ENTRY(CLSID_Folder, CFolder)
  37. OBJECT_ENTRY(CLSID_Drive, CFolder)
  38. OBJECT_ENTRY(CLSID_View, CView)
  39. OBJECT_ENTRY(CLSID_VolumeDlg, CVolumeDlg)
  40. OBJECT_ENTRY(CLSID_DropHandler, CDropHandler)
  41. END_OBJECT_MAP()
  42. /////////////////////////////////////////////////////////////////////////////
  43. // DLL Entry Point
  44. extern "C"
  45. BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
  46. {
  47.    if (dwReason == DLL_PROCESS_ATTACH) {
  48.      _Module.Init(ObjectMap, hInstance);
  49.      _Module.m_CFSTR_ADFID = (CLIPFORMAT)::RegisterClipboardFormat(_T("AdfID"));
  50.      CreateImageLists();
  51.      ::DisableThreadLibraryCalls(hInstance);
  52.    }
  53.    else if (dwReason == DLL_PROCESS_DETACH) {
  54.      _Module.Term();
  55.    }
  56.    return TRUE;    // ok
  57. }
  58. /////////////////////////////////////////////////////////////////////////////
  59. // Used to determine whether the DLL can be unloaded by OLE
  60. STDAPI DllCanUnloadNow(void)
  61. {
  62.    return _Module.GetLockCount()==0 ? S_OK : S_FALSE;
  63. }
  64. /////////////////////////////////////////////////////////////////////////////
  65. // Returns a class factory to create an object of the requested type
  66. STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
  67. {
  68.    return _Module.GetClassObject(rclsid, riid, ppv);
  69. }
  70. /////////////////////////////////////////////////////////////////////////////
  71. // DllRegisterServer - Adds entries to the system registry
  72. STDAPI DllRegisterServer(void)
  73. {
  74.    // Registers object, typelib and all interfaces in typelib
  75.    HRESULT hr; 
  76.    _Module.m_adf.SetSilent(TRUE);
  77.    hr = _Module.RegisterServer();
  78.    if( SUCCEEDED(hr) ) {
  79.       // Tell Shell that we've updated assoc. icons
  80.       ::SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);
  81.    }
  82. #ifdef _DEBUG
  83.    // During DEBUG I have found it neat to kill the Explorer
  84.    // during DLL registration under W2K.
  85.    // It is much easier to debug this way because once you
  86.    // start tracing (running) you effectively debug the
  87.    // first instance of Explorer.exe!
  88.    HWND hwndShell = ::FindWindow(_T("Progman"), NULL);
  89.    ::PostMessage(hwndShell, WM_QUIT, 0, 0L);
  90.    //::WinExec("Explorer.exe",SW_SHOW); 
  91. #endif
  92.    return hr;
  93. }
  94. /////////////////////////////////////////////////////////////////////////////
  95. // DllUnregisterServer - Removes entries from the system registry
  96. STDAPI DllUnregisterServer(void)
  97. {
  98.    return _Module.UnregisterServer(FALSE);
  99. }
  100. /////////////////////////////////////////////////////////////////////////////
  101. // RUNDLL32 support
  102. void CALLBACK Install(HWND /*hwndStub*/, HINSTANCE /*hInstance*/, LPSTR /*lpszCmdLine*/, int /*nCmdShow*/)
  103. {
  104.    if( FAILED( DllRegisterServer() ) ) {
  105.       CResString<64> sText(IDS_INSTALLERROR);
  106.       CResString<64> sCaption(IDS_PROJNAME);
  107.       ::MessageBox(NULL, sText, sCaption, MB_ICONSTOP);
  108.    }
  109. }
  110. void CALLBACK Uninstall(HWND hwndStub, HINSTANCE /*hInstance*/, LPSTR lpszCmdLine, int /*nCmdShow*/)
  111. {
  112.    DllUnregisterServer();
  113.    TCHAR szFmt[] = _T("setupapi.dll,InstallHinfSection DefaultUninstall 132 %s");
  114.    TCHAR szCmd[lengthof(szFmt)+MAX_PATH];
  115.    ::wsprintf(szCmd, szFmt, lpszCmdLine);
  116.    ::ShellExecute(hwndStub, NULL, _T("rundll32.exe"), szCmd, NULL, SW_SHOWMINIMIZED);
  117.    // BUG: This DLL could still be locked when SETUPAPI.DLL attempts to delete it
  118. }
  119. void CALLBACK ShellNew(HWND /*hwndStub*/, HINSTANCE /*hInstance*/, LPSTR lpszCmdLine, int /*nCmdShow*/)
  120. {
  121.    // Show the "Shell New" wizard dialog
  122.    USES_CONVERSION;
  123.    ::InitCommonControls();
  124.    CShellNewDlg dlg;
  125.    dlg._Init(A2CT(lpszCmdLine));
  126.    dlg.DoModal();
  127. };