社本@元ネオニート Blog

社本@元ネオニート (元々ワック) のいたずら書き (for Programmers)

AILight Banner
AILight Blog

プロフィール

社本@元ネオニート Blog
働いたら負けかなと思っていたのですが。。とうとう働き始めました。アメリカのシアトル・エリアにある企業向けのバックアップソフトを開発している会社です。日本人は私だけ。なんとか。。やっていけてるようです。

目次

Blog 利用状況

記事分類

過去の記事

タグ

IE7の中からのプロセスの作成 その4 - Windows Vista/Internet Explorer 7 - 社本@ワック

>> 前回の記事では、単純に説明してしまいましたが、
>> プロセスの起動は、実行ファイルごとにポリシー値を
>> レジストリに設定することによって、制御できます。
>
>簡単に登録/解除を行うための関数を整備してみました。

このレジストリにある設定なのですが、プロセスを作成する際に
全てを列挙しているわけではなく、どうやら登録の単位となる
GUIDをキャッシュしているようです。

そのため、IEが起動している最中は、登録や削除しても反映されません。
中途半端に、GUIDだけキャッシュなんてしないで、全部キャッシュするか
全部読み直すかしてくれれば、納得なんですけどね。

。。と文句を言っていても仕方ないので正規の手法を探していたところ、
再起動マネージャ (Restart Manager)を使って、IEを再起動すればよいと
いうことが分かりました。

以下が、IEを再起動かけさせる関数です。

---
 static DWORD RestartIE(bool bX86 = true)
 {
  DWORD dwResult = ERROR_SUCCESS;

  KNOWNFOLDERID knwonFolderID = (bX86) ? FOLDERID_ProgramFilesX86 : FOLDERID_ProgramFilesX64;
  CStringW strProgramFilesFolder(CKnownFolderHelper::GetKnownFolderPath(knwonFolderID));
  if (strProgramFilesFolder.IsEmpty())
  {
   return !ERROR_SUCCESS;
  }

  CStringW strIExplorerFileName = strProgramFilesFolder + L"Internet Explorer\\iexplore.exe";
  CStringW strIEUserFileName = strProgramFilesFolder + L"Internet Explorer\\ieuser.exe";

  // セッションハンドル管理オブジェクト
  CRmSession session;

  // Starting Session 
  WCHAR szSessionKey[CCH_RM_SESSION_KEY + 1] = { 0 };
  dwResult = session.StartSession(0, szSessionKey);
  if (dwResult != ERROR_SUCCESS)
  {
   return dwResult;
  }

  // Register items 
  DWORD nFiles = 2;
  LPCWSTR szFileNames[] = { (LPCWSTR)strIExplorerFileName, (LPCWSTR)strIEUserFileName };
  dwResult = session.RegisterResources(nFiles, szFileNames, 0, NULL, 0, NULL); 
  if (dwResult != ERROR_SUCCESS)
  {
   return dwResult;
  }

  UINT nProcInfo = 100; 
  CHeapPtr rmProcInfos;
  bool bAllocate = rmProcInfos.Allocate(nProcInfo);
  if (!bAllocate)
  {
   return ERROR_NOT_ENOUGH_MEMORY;
  }

  // Getting affected apps 
  UINT nProcInfoNeeded = 0; 
  DWORD dwRebootReason = 0; 
  dwResult = session.GetList(&nProcInfoNeeded, &nProcInfo, rmProcInfos, &dwRebootReason); 
  if (dwResult != ERROR_SUCCESS)
  {
   return dwResult;
  }

  // Apply filter to shutdown iexplore processes only 
  dwResult = session.AddFilter(szFileNames[1], NULL, NULL, RmNoShutdown); 
  if (dwResult != ERROR_SUCCESS)
  {
   return dwResult;
  }

  // Shutdown iexplore processes 
  dwResult = session.Shutdown(0, NULL); 
  if (dwResult != ERROR_SUCCESS)
  {
   return dwResult;
  }

  // Remove previous filter & apply filter to shutdown ieuser only 
  dwResult = session.RemoveFilter(szFileNames[1], NULL, NULL); 
  if (dwResult != ERROR_SUCCESS)
  {
   return dwResult;
  }

  dwResult = session.AddFilter(szFileNames[0], NULL, NULL, RmNoShutdown); 
  if (dwResult != ERROR_SUCCESS)
  {
   return dwResult;
  }

  // Shutdown ieuser process 
  dwResult = session.Shutdown(0, NULL); 
  if (dwResult != ERROR_SUCCESS)
  {
   return dwResult;
  }

  // Remove filter applied to ieuser process 
  dwResult = session.RemoveFilter(szFileNames[0], NULL, NULL); 
  if (dwResult != ERROR_SUCCESS)
  {
   return dwResult;
  }

  // Apply filter to restart ieuser process only 
  dwResult = session.AddFilter(szFileNames[0], NULL, NULL, RmNoRestart); 
  if (dwResult != ERROR_SUCCESS)
  {
   return dwResult;
  }

  // Restart ieuser 
  dwResult = session.Restart(NULL, NULL); 
  if (dwResult != ERROR_SUCCESS)
  {
   return dwResult;
  }

  // Remove previous filter & add filter to restart iexplore only 
  dwResult = session.RemoveFilter(szFileNames[0], NULL, NULL); 
  if (dwResult != ERROR_SUCCESS)
  {
   return dwResult;
  }

  dwResult = session.AddFilter(szFileNames[1], NULL, NULL, RmNoRestart); 
  if (dwResult != ERROR_SUCCESS)
  {
   return dwResult; 
  }

  // Restart iexplore 
  dwResult = session.Restart(NULL, NULL); 
  if (dwResult != ERROR_SUCCESS)
  {
   return dwResult; 
  }

  return dwResult; 
 }
 static HRESULT Probe_SHGetKnownFolderPath(REFKNOWNFOLDERID rfid, DWORD dwFlags, HANDLE hToken, PWSTR* ppszPath)
 {
  CModule module;

  HINSTANCE hInst = module.LoadLibrary(_T("shell32.dll"));
  if (hInst == NULL)
  {
   return E_NOTIMPL; 
  }

  typedef HRESULT (WINAPI *FUNC_SHGETKNOWNFOLDERPATH) (REFKNOWNFOLDERID, DWORD, HANDLE, PWSTR*);
  CString strFuncName = _T("SHGetKnownFolderPath");
  FUNC_SHGETKNOWNFOLDERPATH func = (FUNC_SHGETKNOWNFOLDERPATH)module.GetProcAddress(strFuncName);
  if (func == NULL)
  {
   return E_NOTIMPL; 
  }

  return (*func)(rfid, dwFlags, hToken, ppszPath);
 }
 static CString GetKnownFolderPath(REFKNOWNFOLDERID rfid, DWORD dwFlags = KF_FLAG_NO_ALIAS, HANDLE hToken = NULL)
 {
  USES_CONVERSION;

  HRESULT hr = S_OK;

  PWSTR szPath = NULL;
  hr = thisClass::Probe_SHGetKnownFolderPath(rfid, dwFlags, hToken, &szPath);
  if (FAILED(hr))
  {
   ATLASSERT(0);
   return _T("");
  }

  WCHAR szResult[_MAX_PATH] = { 0 };
#if _SECURE_ATL
  wcscpy_s(szResult, szPath);
#else
  wcscpy(szResult, szPath);
#endif

  ::CoTaskMemFree(szPath);
  ::PathAddBackslashW(szResult);             // SHLWAPI 4.71

  return W2T(szResult);
 }

ただし、IE7は、再起動マネージャ (Restart Manager)を使って
再起動させると余計なタブが表示されるという不具合があります。


■IE7の中からのプロセスの作成 その3 - Windows Vista/Internet Explorer 7 - 社本@ワック
http://www.ailight.jp/blog/sha256/archive/2007/02/21/13603.aspx

■再起動マネージャー (Restart Manager) API のクラス - Windows Vista - 社本@ワック
http://www.ailight.jp/blog/sha256/archive/2007/02/22/13609.aspx

■IE7は、再起動マネージャー (Restart Manager)を使って再起動させると余計なタブが表示される - Windows Vista/Internet Explorer 7 - 社本@ワック
http://www.ailight.jp/blog/sha256/archive/2007/02/09/13563.aspx

■Internet Explorer caches settings - Vista Compatibility Team Blog
http://blogs.msdn.com/vistacompatteam/archive/2007/02/07/internet-explorer-caches-settings.aspx

投稿日時 : 2007年2月26日 17:49


コメントを追加

タイトル
名前
URL
コメント