dllreg_job.cpp
上传用户:sencon168
上传日期:2007-01-04
资源大小:22k
文件大小:4k
源码类别:

Shell编程

开发平台:

Visual C++

  1. #include "dllreg_xhdr.h"
  2. #include "dllregshex.h"
  3. #include "dllreg_util.h"
  4. #include "resource.h"
  5. #include <stdio.h>
  6. extern HINSTANCE g_hmodThisDll;
  7. STDMETHODIMP 
  8. CShellExt::_GetFullFileName()
  9. {
  10. HRESULT hr = S_FALSE;
  11. //
  12. // IEnumFORMATETC. Needed for format enumeration.
  13. //
  14. IEnumFORMATETC *pefEtc = 0;
  15. hr = m_pDataObj->EnumFormatEtc(DATADIR_GET, &pefEtc);
  16. if(SUCCEEDED(hr))
  17. {
  18. hr = pefEtc->Reset(); // Reset enumeration.
  19. if(SUCCEEDED(hr))
  20. {
  21. //
  22. // FORMATETC. Needed for get data about object.
  23. //
  24. FORMATETC fEtc;
  25. ULONG ulFetched = 0L;
  26. while(TRUE)
  27. {
  28. hr = pefEtc->Next(1, &fEtc, &ulFetched);
  29. if(FAILED(hr) || (ulFetched <= 0))
  30. break;
  31. //
  32. // 'Arm' format and 'launch' to obtain STGMEDIUM...
  33. //
  34. fEtc.cfFormat = CF_HDROP;
  35. fEtc.dwAspect = DVASPECT_CONTENT;
  36. fEtc.lindex = -1;
  37. fEtc.ptd = NULL;
  38. fEtc.tymed = TYMED_HGLOBAL;
  39. //
  40. // IDataObject : GetData. Returned as TYMED_HGLOBAL.
  41. //
  42. STGMEDIUM stgM;
  43. hr = m_pDataObj->GetData(&fEtc, &stgM);
  44. if(SUCCEEDED(hr))
  45. {
  46. if(stgM.tymed == TYMED_HGLOBAL)
  47. {
  48. m_szFileUserClickedOn[0] = '';
  49. if(DragQueryFile((HDROP)stgM.hGlobal, (UINT)(-1), NULL, 0) == 1)
  50. {
  51. // one file only; eliminate this and improve code to allow multiple-DLL file (un)registering
  52. DragQueryFile((HDROP)stgM.hGlobal, 0, m_szFileUserClickedOn, _MAX_PATH + 1);
  53. }
  54. }
  55. }
  56. }
  57. }
  58. }
  59. if(pefEtc)
  60. pefEtc->Release();
  61. return hr;
  62. }
  63. STDMETHODIMP
  64. CShellExt::_DoRegisterJob(HWND hParent, LPCSTR pszWorkingDir, LPCSTR pszCmd, LPCSTR pszParam, int iShowCmd, 
  65. const int cintOpCode)
  66. {
  67. _UNUSED_PARAMETER(iShowCmd);
  68. _UNUSED_PARAMETER(pszParam);
  69. _UNUSED_PARAMETER(pszCmd);
  70. HRESULT hr = S_FALSE;
  71. hr = _GetFullFileName();
  72. if(SUCCEEDED(hr))
  73. {
  74. char lpszFmtText[512], lpszAsk[1024], lpszRelName[2 * (_MAX_PATH + 1)];
  75. // format string for user confirmation
  76. LoadString(g_hmodThisDll, IDS_Q_INSTALL, lpszFmtText, 512);
  77. // relative filename; pointer arithmetic ("C:\TEMP\file.dll" - "C:\TEMP\" = "file.dll"
  78. strcpy(lpszRelName, m_szFileUserClickedOn + ((strlen(pszWorkingDir) + 1) * sizeof(char)));
  79. // compose message
  80. sprintf(lpszAsk, lpszFmtText, lpszRelName);
  81. if(MessageBox(0, lpszAsk, 0, MB_YESNO | MB_ICONQUESTION) == IDYES)
  82. {
  83. char pszCmdLine[_MAX_PATH + 1]; // command line for regsvr32.exe
  84. switch(cintOpCode)
  85. {
  86. case REGDLL_INSTALL:
  87. sprintf(pszCmdLine, "regsvr32.exe "%s"", m_szFileUserClickedOn);
  88. break;
  89. case REGDLL_UNINSTALL:
  90. sprintf(pszCmdLine, "regsvr32.exe /u "%s"", m_szFileUserClickedOn);
  91. break;
  92. default:
  93. break;
  94. }
  95. STARTUPINFO si;
  96. PROCESS_INFORMATION pi;
  97. ZeroMemory(&si, sizeof(si));
  98. si.cb = sizeof(STARTUPINFO);
  99. si.dwFlags = STARTF_USESHOWWINDOW;
  100. si.wShowWindow = SW_SHOW;
  101. ZeroMemory(&pi, sizeof(pi));
  102. if(CreateProcess(0, pszCmdLine, 0, 0, FALSE, CREATE_DEFAULT_ERROR_MODE | NORMAL_PRIORITY_CLASS, 0, 0, &si, &pi))
  103. {
  104. CloseHandle(pi.hProcess);
  105. CloseHandle(pi.hThread);
  106. }
  107. else
  108. MessageBox(0, "Unable to run regsvr32.exe process.", DLLREGUNREGNAME, MB_OK);
  109. }
  110. else
  111. MessageBox(hParent, "User abort!", DLLREGUNREGNAME, MB_OK);
  112. }
  113. return NOERROR;
  114. }
  115. STDMETHODIMP 
  116. CShellExt::DoInstall(HWND hParent, LPCSTR pszWorkingDir, LPCSTR pszCmd, LPCSTR pszParam, int iShowCmd)
  117. {
  118. return _DoRegisterJob(hParent, pszWorkingDir, pszCmd, pszParam, iShowCmd, REGDLL_INSTALL);
  119. }
  120. STDMETHODIMP 
  121. CShellExt::DoUninstall(HWND hParent, LPCSTR pszWorkingDir, LPCSTR pszCmd, LPCSTR pszParam, int iShowCmd)
  122. {
  123. return _DoRegisterJob(hParent, pszWorkingDir, pszCmd, pszParam, iShowCmd, REGDLL_UNINSTALL);
  124. }
  125. STDMETHODIMP 
  126. CShellExt::DoAbout(HWND hParent, LPCSTR pszWorkingDir, LPCSTR pszCmd, LPCSTR pszParam, int iShowCmd)
  127. {
  128. _UNUSED_PARAMETER(iShowCmd);
  129. _UNUSED_PARAMETER(pszParam);
  130. _UNUSED_PARAMETER(pszCmd);
  131. _UNUSED_PARAMETER(pszWorkingDir);
  132. char szAboutText[1024];
  133. LoadString(g_hmodThisDll, IDS_ABOUT, szAboutText, 1024);
  134. MessageBox(hParent, szAboutText, DLLREGUNREGNAME, MB_OK | MB_ICONINFORMATION);
  135. return NOERROR;
  136. }