<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>COM/ActiveX/OLE</title><link>http://www.ailight.jp/blog/sha256/category/161.aspx</link><description>COM/ActiveX/OLE</description><managingEditor>社本＠元ネオニート</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>社本＠ワック</dc:creator><title>DLRで重要そうなインターフェース/クラス - DLR/.NET Framework</title><link>http://www.ailight.jp/blog/sha256/archive/2007/06/20/13907.aspx</link><pubDate>Tue, 19 Jun 2007 17:05:00 GMT</pubDate><guid>http://www.ailight.jp/blog/sha256/archive/2007/06/20/13907.aspx</guid><wfw:comment>http://www.ailight.jp/blog/sha256/comments/13907.aspx</wfw:comment><comments>http://www.ailight.jp/blog/sha256/archive/2007/06/20/13907.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.ailight.jp/blog/sha256/comments/commentRss/13907.aspx</wfw:commentRss><trackback:ping>http://www.ailight.jp/blog/sha256/services/trackbacks/13907.aspx</trackback:ping><description>&lt;P&gt;
今日、IronPython のコードを見ればいいことは分かった。&lt;BR&gt;
とりあえず、DLRで重要そうなインターフェース/クラスは&lt;BR&gt;
こんな(↓)もんかな。。&lt;BR&gt;
&lt;BR&gt;
・Microsoft.Scripting.IDynamicObject&lt;BR&gt;・Microsoft.Scripting.Script&lt;BR&gt;・Microsoft.Scripting.IScriptModule&lt;BR&gt;・Microsoft.Scripting.Hosting.IScriptEngine&lt;BR&gt;・Microsoft.Scripting.Hosting.IScriptHost&lt;BR&gt;・Microsoft.Scripting.Shell.IConsole&lt;BR&gt;
&lt;BR&gt;
早く自分のアプリでホストしてみたいよねぇ。&lt;BR&gt;
&lt;BR&gt;
&lt;BR&gt;
■IDynamicObject.cs - IronPyton - CodePlex&lt;BR&gt;&lt;A href="http://www.codeplex.com/IronPython/SourceControl/FileView.aspx?itemId=297900&amp;amp;changeSetId=21805"&gt;http://www.codeplex.com/IronPython/SourceControl/FileView.aspx?itemId=297900&amp;amp;changeSetId=21805&lt;/A&gt;&lt;BR&gt;
&lt;BR&gt;
■Script.cs - IronPyton - CodePlex&lt;BR&gt;&lt;A href="http://www.codeplex.com/IronPython/SourceControl/FileView.aspx?itemId=298075&amp;amp;changeSetId=21805"&gt;http://www.codeplex.com/IronPython/SourceControl/FileView.aspx?itemId=298075&amp;amp;changeSetId=21805&lt;/A&gt;&lt;BR&gt;
&lt;BR&gt;
■ScriptModule.cs - IronPyton - CodePlex&lt;BR&gt;&lt;A href="http://www.codeplex.com/IronPython/SourceControl/FileView.aspx?itemId=298083&amp;amp;changeSetId=21805"&gt;http://www.codeplex.com/IronPython/SourceControl/FileView.aspx?itemId=298083&amp;amp;changeSetId=21805&lt;/A&gt;&lt;BR&gt;
&lt;BR&gt;
■Hosting/ScriptEngine.cs - IronPyton - CodePlex&lt;BR&gt;&lt;A href="http://www.codeplex.com/IronPython/SourceControl/FileView.aspx?itemId=298098&amp;amp;changeSetId=21805"&gt;http://www.codeplex.com/IronPython/SourceControl/FileView.aspx?itemId=298098&amp;amp;changeSetId=21805&lt;/A&gt;&lt;BR&gt;
&lt;BR&gt;
■Hosting/ScriptHost.cs - IronPyton - CodePlex&lt;BR&gt;&lt;A href="http://www.codeplex.com/IronPython/SourceControl/FileView.aspx?itemId=298117&amp;amp;changeSetId=21805"&gt;http://www.codeplex.com/IronPython/SourceControl/FileView.aspx?itemId=298117&amp;amp;changeSetId=21805&lt;/A&gt;&lt;BR&gt;
&lt;BR&gt;
■Shell/IConsole.cs - IronPyton - CodePlex&lt;BR&gt;&lt;A href="http://www.codeplex.com/IronPython/SourceControl/FileView.aspx?itemId=298185&amp;amp;changeSetId=21805"&gt;http://www.codeplex.com/IronPython/SourceControl/FileView.aspx?itemId=298185&amp;amp;changeSetId=21805&lt;/A&gt;&lt;BR&gt;
&lt;/P&gt;&lt;img src ="http://www.ailight.jp/blog/sha256/aggbug/13907.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>社本＠ワック</dc:creator><title>IE7の中からのプロセスの作成 その５ - Windows Vista/Internet Explorer 7 </title><link>http://www.ailight.jp/blog/sha256/archive/2007/06/14/13901.aspx</link><pubDate>Thu, 14 Jun 2007 04:57:00 GMT</pubDate><guid>http://www.ailight.jp/blog/sha256/archive/2007/06/14/13901.aspx</guid><wfw:comment>http://www.ailight.jp/blog/sha256/comments/13901.aspx</wfw:comment><comments>http://www.ailight.jp/blog/sha256/archive/2007/06/14/13901.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.ailight.jp/blog/sha256/comments/commentRss/13901.aspx</wfw:commentRss><trackback:ping>http://www.ailight.jp/blog/sha256/services/trackbacks/13901.aspx</trackback:ping><description>&lt;P&gt;
&amp;gt; &amp;gt; &amp;gt; 前回の記事では、単純に説明してしまいましたが、&lt;BR&gt;
&amp;gt; &amp;gt; &amp;gt; プロセスの起動は、実行ファイルごとにポリシー値を&lt;BR&gt;
&amp;gt; &amp;gt; &amp;gt; レジストリに設定することによって、制御できます。&lt;BR&gt;
&amp;gt; &amp;gt;&lt;BR&gt;&amp;gt; &amp;gt; 簡単に登録/解除を行うための関数を整備してみました。&lt;BR&gt;
&amp;gt;&lt;BR&gt;&amp;gt; このレジストリにある設定なのですが、プロセスを作成する際に&lt;BR&gt;
&amp;gt; 全てを列挙しているわけではなく、どうやら登録の単位となる&lt;BR&gt;&amp;gt; GUIDをキャッシュしているようです。&lt;BR&gt;&amp;gt; &lt;BR&gt;&amp;gt; そのため、IEが起動している最中は、登録や削除しても反映されません。&lt;BR&gt;&amp;gt; 中途半端に、GUIDだけキャッシュなんてしないで、全部キャッシュするか&lt;BR&gt;
&amp;gt; 全部読み直すかしてくれれば、納得なんですけどね。&lt;BR&gt;
&lt;BR&gt;
昨日、公開されたばかり(！) の IERefreshElevationPolicy API を使えば、&lt;BR&gt;
この問題を解決できそうです。&lt;BR&gt;
&lt;BR&gt;
&lt;PRE&gt;
---
static HRESULT Probe_IERefreshElevationPolicy()
{
 CModule module;

 HINSTANCE hInst = module.LoadLibrary(_T("ieframe.dll"));
 if (hInst == NULL)
 {
  return E_NOTIMPL; 
 }

 typedef HRESULT (WINAPI *FUNC_IEREFRESHELEVATIONPOLICY)();
 CString strProcName = _T("IERefreshElevationPolicy");
 FUNC_IEREFRESHELEVATIONPOLICY func = (FUNC_IEREFRESHELEVATIONPOLICY)module.GetProcAddress(strProcName);
 if (func == NULL)
 {
  return E_NOTIMPL; 
 }

 return (*func)();
}
---
&lt;/PRE&gt;
&lt;BR&gt;
■IE7の中からのプロセスの作成 その４ - Windows Vista/Internet Explorer 7 - 社本＠ワック&lt;BR&gt;
&lt;A href="http://www.ailight.jp/blog/sha256/archive/2007/02/26/13611.aspx"&gt;http://www.ailight.jp/blog/sha256/archive/2007/02/26/13611.aspx&lt;/A&gt;&lt;BR&gt;
&lt;BR&gt;
■New API Smoothes Extension Development in Protected Mode - IEBlog&lt;BR&gt;
&lt;A href="http://blogs.msdn.com/ie/archive/2007/06/13/new-api-smoothes-extension-development-in-protected-mode.aspx"&gt;http://blogs.msdn.com/ie/archive/2007/06/13/new-api-smoothes-extension-development-in-protected-mode.aspx&lt;/A&gt;&lt;BR&gt;
&lt;BR&gt;
■DLLを扱うクラス (CModule) - for Programmers&lt;BR&gt;
&lt;A href="http://www.wac-jp.com/programmers/win32/Module.html"&gt;http://www.wac-jp.com/programmers/win32/Module.html&lt;/A&gt;&lt;BR&gt;
&lt;/P&gt;&lt;img src ="http://www.ailight.jp/blog/sha256/aggbug/13901.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>社本＠ワック</dc:creator><title>HTML(Script)側へのオブジェクトの公開 その３- IE/WebBrowser</title><link>http://www.ailight.jp/blog/sha256/archive/2007/06/11/13896.aspx</link><pubDate>Mon, 11 Jun 2007 08:36:00 GMT</pubDate><guid>http://www.ailight.jp/blog/sha256/archive/2007/06/11/13896.aspx</guid><wfw:comment>http://www.ailight.jp/blog/sha256/comments/13896.aspx</wfw:comment><comments>http://www.ailight.jp/blog/sha256/archive/2007/06/11/13896.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.ailight.jp/blog/sha256/comments/commentRss/13896.aspx</wfw:commentRss><trackback:ping>http://www.ailight.jp/blog/sha256/services/trackbacks/13896.aspx</trackback:ping><description>&lt;P&gt;&amp;gt; なんと、グローバルな領域にオブジェクトを公開している&lt;BR&gt;&amp;gt; ではないですか！！&lt;BR&gt;&amp;gt; 彼らにできて、オレにできないなんて許せない！という訳で、&lt;BR&gt;&amp;gt; 再度、調査をしてみることにしました。&lt;BR&gt;&lt;BR&gt;IHTMLDocument::get_Scriptで取得できるオブジェクトが&lt;BR&gt;IDispatchExを実装しており、これにプロパティとして&lt;BR&gt;オブジェクトを追加すればよいだけでした。&lt;BR&gt;&lt;BR&gt;分かってしまえば、IDocHostUIHandlerを使った実装&lt;BR&gt;よりも簡単でした。&lt;BR&gt;&lt;BR&gt;&lt;PRE&gt;---
#include &amp;lt;exdispid.h&amp;gt;
#include &amp;lt;DispEx.h&amp;gt;

// Native Compiler COM Support
#include &amp;lt;comdef.h&amp;gt;        // _com_error
#include &amp;lt;comutil.h&amp;gt;       // _bstr_t, _variant_t
#include &amp;lt;comip.h&amp;gt;        // _com_ptr_t
#pragma comment(lib, "comsupp.lib")
#pragma comment(lib, "comsuppw.lib")

#if 0
#pragma warning(push)
#pragma warning(disable: 4192)
#pragma warning(disable: 4278)
#pragma warning(disable: 4279)
#import &amp;lt;shdocvw.dll&amp;gt;
#import &amp;lt;mshtml.tlb&amp;gt;
#pragma warning(pop)
#else
#include &amp;lt;ExDisp.h&amp;gt;        // IWebBrowser2
#include &amp;lt;MsHTML.h&amp;gt;        // IHTMLDocument2
#endif

#if _MSC_VER &lt; 1400
#if !defined(_countof)
#define _countof(_Array) (sizeof(_Array) / sizeof(_Array[0]))
#endif
#endif



/////////////////////////////////////////////////////////////////////////////
// CIEScriptHelper

class CIEScriptHelper
{
protected:
 typedef CIEScriptHelper      thisClass;

protected:
 CIEScriptHelper();       // 実装しない
 virtual ~CIEScriptHelper();

public:
#if 0
 // Scriptオブジェクトを取得
 static IDispatchExPtr GetScript(SHDocVw::IWebBrowser2Ptr spWebBrowser2)
 {
  if (spWebBrowser2 == NULL)
  {
   ATLASSERT(0);
   return NULL;
  }

  IDispatchExPtr spResult;

  try
  {
   MSHTML::IHTMLDocument2Ptr spHTMLDocuemt2 = spWebBrowser2-&gt;Document;
   if (spHTMLDocuemt2 == NULL)
   {
    return NULL;
   }

   spResult = spHTMLDocuemt2-&gt;Script;
   if (spResult == NULL)
   {
    return NULL;
   }
  }
  catch (...)
  {
   ATLASSERT(0);
   return NULL;
  }

  return spResult;
 }
#else
 // Scriptオブジェクトを取得
 static IDispatchExPtr GetScript(IWebBrowser2Ptr spWebBrowser2)
 {
  if (spWebBrowser2 == NULL)
  {
   ATLASSERT(0);
   return NULL;
  }

  HRESULT hr = S_OK;

  IDispatchPtr spDispHTMLDocuemt2;
  hr = spWebBrowser2-&gt;get_Document(&amp;spDispHTMLDocuemt2);
  if (FAILED(hr))
  {
   return NULL;
  }

  IHTMLDocument2Ptr spHTMLDocuemt2 = spDispHTMLDocuemt2;
  if (spHTMLDocuemt2 == NULL)
  {
   return NULL;
  }

  IDispatchPtr spDispScript;
  hr = spHTMLDocuemt2-&gt;get_Script(&amp;spDispScript);
  if (FAILED(hr))
  {
   return NULL;
  }

  IDispatchExPtr spScript = spDispScript;
  if (spScript == NULL)
  {
   return NULL;
  }

  return spScript;
 }
#endif

public:
 // プロパティを登録
 static HRESULT RegisterProperty(IDispatchExPtr spDispatchEx, LPCTSTR szName, _variant_t varValue)
 {
  if (spDispatchEx == NULL)
  {
   ATLASSERT(0);
   return E_FAIL;
  }

  HRESULT hr = S_OK;

  DISPID dispID = 0;
  hr = spDispatchEx-&gt;GetDispID(_bstr_t(szName), fdexNameEnsure | fdexNameCaseSensitive, &amp;dispID);
  if (FAILED(hr))
  {
   return hr;
  }

  DISPID dispidNamedArgs = DISPID_PROPERTYPUT;

  DISPPARAMS dispParams = { &amp;varValue, &amp;dispidNamedArgs, 1, 1 };
  EXCEPINFO excepInfo = { 0 };
  hr = spDispatchEx-&gt;InvokeEx(dispID, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT, &amp;dispParams, NULL, &amp;excepInfo, NULL);
  if (FAILED(hr))
  {
   return hr;
  }

  return S_OK;
 }
 // プロパティを登録解除
 static HRESULT UnregisterProperty(IDispatchExPtr spDispatchEx, LPCTSTR szName)
 {
  USES_CONVERSION;

  if (spDispatchEx == NULL)
  {
   ATLASSERT(0);
   return E_FAIL;
  }

  HRESULT hr = S_OK;

#if 1
  LPOLESTR szNames[] = { T2W(szName) };
  DISPID dispID = 0;
  hr = spDispatchEx-&gt;GetIDsOfNames(IID_NULL, szNames, _countof(szNames), LOCALE_USER_DEFAULT, &amp;dispID);
  if (FAILED(hr))
  {
   return hr;
  }

  hr = spDispatchEx-&gt;DeleteMemberByDispID(dispID);
  if (FAILED(hr))
  {
   // NOTE: E_NOTIMPLになる。。
   return hr;
  }
#else
  hr = spDispatchEx-&gt;DeleteMemberByName(_bstr_t(szName), fdexNameCaseSensitive);
  if (FAILED(hr))
  {
   // NOTE: E_NOTIMPLになる。。
   return hr;
  }
#endif

  return S_OK;
 }
 // プロパティを取得
 static HRESULT GetProperty(IDispatchExPtr spDispatchEx, LPCTSTR szName, _variant_t&amp; varValue)
 {
  USES_CONVERSION;

  if (spDispatchEx == NULL)
  {
   ATLASSERT(0);
   return E_FAIL;
  }

  HRESULT hr = S_OK;

  LPOLESTR szNames[] = { T2W(szName) };
  DISPID dispID = 0;
  hr = spDispatchEx-&gt;GetIDsOfNames(IID_NULL, szNames, _countof(szNames), LOCALE_USER_DEFAULT, &amp;dispID);
  if (FAILED(hr))
  {
   return hr;
  }

  DISPPARAMS dispParams = { NULL, NULL, 0, 0 };
  _variant_t var;
  hr = spDispatchEx-&gt;Invoke(dispID, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &amp;dispParams, &amp;var, NULL, NULL);
  if (FAILED(hr))
  {
   return hr;
  }

  return S_OK;
 }
};
---

---
■ブラウザをホストするアプリ
 void __stdcall OnNavigateComplete2(IDispatch * pDisp, VARIANT * URL)
 {
  HRESULT hr = S_OK;

  try
  {
   IDispatchExPtr spScript = CIEScriptHelper::GetScript((IUnknown*)m_wndWebBrowser2);
   if (spScript == NULL)
   {
    return;
   }

   // ブラウザ(IWebBrowser2)自身を、Hogeとして登録
   hr = CIEScriptHelper::RegisterProperty(spScript, _T("Hoge"), _variant_t(pDisp));
   if (FAILED(hr))
   {
    return;
   }

   // 取得
   _variant_t varValue;
   hr = CIEScriptHelper::GetProperty(spScript, _T("Hoge"), varValue);
   if (FAILED(hr))
   {
    return;
   }

   // spHoge == pDisp である
   IDispatchPtr spHoge = (IDispatch*)varValue;

/*
   // 登録解除
   hr = CIEScriptHelper::UnregisterProperty(spScript, _T("Hoge"));
   if (FAILED(hr))
   {
    // 無視する。。
   }
*/
  }
  catch (...)
  {
   ATLASSERT(0);
  }
 }
---

---
■HTMLのサンプル
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;title&gt;Sample&amp;lt;/title&amp;gt;

&amp;lt;script language="jscript"&amp;gt;
function onClick()
{
 Hoge.Navigate2("http://www.wac-jp.com/");
}

&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
 &amp;lt;br /&amp;gt;
 &amp;lt;br /&amp;gt;
 &amp;lt;input type="button" value="hoge" onClick="javascript:onClick();" /&amp;gt;
 &amp;lt;br /&amp;gt;
 &amp;lt;br /&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
---
&lt;/PRE&gt;&lt;BR&gt;&lt;BR&gt;■IHTMLDocument::Script Property - MSDN&lt;BR&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/aa752642.aspx"&gt;http://msdn2.microsoft.com/en-us/library/aa752642.aspx&lt;/A&gt;&lt;BR&gt;
&lt;/P&gt;&lt;img src ="http://www.ailight.jp/blog/sha256/aggbug/13896.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>社本＠ワック</dc:creator><title>HTML(Script)側へのオブジェクトの公開 その２- IE/WebBrowser</title><link>http://www.ailight.jp/blog/sha256/archive/2007/06/11/13895.aspx</link><pubDate>Mon, 11 Jun 2007 05:55:00 GMT</pubDate><guid>http://www.ailight.jp/blog/sha256/archive/2007/06/11/13895.aspx</guid><wfw:comment>http://www.ailight.jp/blog/sha256/comments/13895.aspx</wfw:comment><comments>http://www.ailight.jp/blog/sha256/archive/2007/06/11/13895.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.ailight.jp/blog/sha256/comments/commentRss/13895.aspx</wfw:commentRss><trackback:ping>http://www.ailight.jp/blog/sha256/services/trackbacks/13895.aspx</trackback:ping><description>&lt;P&gt;
&amp;gt; その場合、ブラウザコントロールをホストしている側に&lt;BR&gt;
&amp;gt; IDocHostUIHandler を実装し、GetExternal メソッドで&lt;BR&gt;
&amp;gt; 独自のオブジェクト (IDispatch) を公開することによって&lt;BR&gt;
&amp;gt; 実現することができます。&lt;BR&gt;
&lt;BR&gt;
長年、この手法を使って各種アプリを作っていたわけですが、&lt;BR&gt;
オブジェクトが グローバルな領域ではなく、window.external&lt;BR&gt;
として公開されることに不満を感じていました。&lt;BR&gt;
&lt;BR&gt;
＃困りはしないんだけど、カッコ悪いからねえ。&lt;BR&gt;
＃みんなも、そう思うでしょ？？(笑)&lt;BR&gt;
&lt;BR&gt;
&lt;BR&gt;
何とかしてグローバルな領域に公開するためには、&lt;BR&gt;
ブラザコントロールが抱えているScripting Engineを&lt;BR&gt;
取得できればいいのではないかと思い調査したのですが、&lt;BR&gt;
うまくいきませんでした。&lt;BR&gt;
&lt;BR&gt;
(SID_GetScriptSiteという思わせぶりなSIDは定義されて&lt;BR&gt;
いるのですが、IQueryServiceProvider::QueryService&lt;BR&gt;
してもダメです。)&lt;BR&gt;
&lt;BR&gt;
&lt;BR&gt;
ずっと諦めていたのですが、SideBar Gadgetの仕様を&lt;BR&gt;
調査していたところ、以下のようなコードを発見しました。&lt;BR&gt;
&lt;BR&gt;
&lt;PRE&gt;
---
function GetHoge()
{
&amp;nbsp;return System.Gadget.Settings.read("Hoge");
}
---
&lt;/PRE&gt;
&lt;BR&gt;
なんと、グローバルな領域にオブジェクトを公開している&lt;BR&gt;
ではないですか！！&lt;BR&gt;
彼らにできて、オレにできないなんて許せない！という訳で、&lt;BR&gt;
再度、調査をしてみることにしました。&lt;BR&gt;
&lt;BR&gt;
&lt;BR&gt;
■IEのスクリプトエンジンへのインターフェイス - @IT&lt;BR&gt;
&lt;A href="http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=1371&amp;amp;forum=7"&gt;http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=1371&amp;amp;forum=7&lt;/A&gt;&lt;BR&gt;
&lt;/P&gt;&lt;img src ="http://www.ailight.jp/blog/sha256/aggbug/13895.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>社本＠ワック</dc:creator><title>HTML(Script)側へのオブジェクトの公開 - IE/WebBrowser</title><link>http://www.ailight.jp/blog/sha256/archive/2007/06/11/13894.aspx</link><pubDate>Mon, 11 Jun 2007 05:28:00 GMT</pubDate><guid>http://www.ailight.jp/blog/sha256/archive/2007/06/11/13894.aspx</guid><wfw:comment>http://www.ailight.jp/blog/sha256/comments/13894.aspx</wfw:comment><comments>http://www.ailight.jp/blog/sha256/archive/2007/06/11/13894.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.ailight.jp/blog/sha256/comments/commentRss/13894.aspx</wfw:commentRss><trackback:ping>http://www.ailight.jp/blog/sha256/services/trackbacks/13894.aspx</trackback:ping><description>&lt;P&gt;ブラウザコントロールをホストしたアプリを作っていると&lt;BR&gt;HTML(Script)側へ何らかの機能を公開したくなることが&lt;BR&gt;あるかと思います。&lt;BR&gt;&lt;BR&gt;その場合、ブラウザコントロールをホストしている側に&lt;BR&gt;IDocHostUIHandler を実装し、GetExternal メソッドで&lt;BR&gt;独自のオブジェクト (IDispatch) を公開することによって&lt;BR&gt;実現することができます。&lt;BR&gt;&lt;BR&gt;IDocHostUIHandler を実装し始めた頃 (98年ごろ) は、&lt;BR&gt;各種ライブラリでのサポートは無く、MFC や ATL の&lt;BR&gt;ライブラリのコードをかいくぐって実装していたものです。&lt;BR&gt;&lt;BR&gt;しかし、今では ATL/MFC/.NET Framework のいずれでも、&lt;BR&gt;簡単にオブジェクトを公開することが可能となっています。&lt;BR&gt;&lt;BR&gt;上記の手法を使ってオブジェクトを公開した場合、&lt;BR&gt;HTML(Script)側では以下のようにアクセスします。&lt;BR&gt;&lt;BR&gt;&lt;PRE&gt;
---
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;title&amp;gt;example&amp;lt;/title&amp;gt;
&amp;lt;script language="jscript"&amp;gt;
function onClick()
{
 // アプリ側でHogeメソッドを持ったオブジェクトを公開
 window.external.Hoge();
}
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
 &amp;lt;br /&amp;gt;
 &amp;lt;br /&amp;gt;
 &amp;lt;input type="button" value="hoge" onClick="javascript:onClick();" /&amp;gt;
 &amp;lt;br /&amp;gt;
 &amp;lt;br /&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
---
&lt;/PRE&gt;&lt;BR&gt;■IDocHostUIHandler Interface - MSDN&lt;BR&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/Aa753260.aspx"&gt;http://msdn2.microsoft.com/en-us/library/Aa753260.aspx&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;■IAxWinHostWindow::SetExternalUIHandler - MSDN&lt;BR&gt;&lt;A href="http://msdn2.microsoft.com/ja-JP/library/9dxkhzcx(VS.80).aspx"&gt;http://msdn2.microsoft.com/ja-JP/library/9dxkhzcx(VS.80).aspx&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;■CHtmlView::OnGetExternal - MSDN&lt;BR&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/bat7a958(VS.71).aspx"&gt;http://msdn2.microsoft.com/en-us/library/bat7a958(VS.71).aspx&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;■WebBrowser.ObjectForScripting プロパティ&amp;nbsp; &lt;BR&gt;&lt;A href="http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.webbrowser.objectforscripting(VS.80).aspx"&gt;http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.webbrowser.objectforscripting(VS.80).aspx&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;■Driller (MFC) - MSDN&lt;BR&gt;&lt;A href="http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/samples/internet/browser/driller/default.asp"&gt;http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/samples/internet/browser/driller/default.asp&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;■MFCベースのアプリケーションで、ブラウザコントロールのカズタマイズを行う[MFC] - for Programmers&lt;BR&gt;&lt;A href="http://www.wac-jp.com/programmers/win32/IDocUIHandler.html"&gt;http://www.wac-jp.com/programmers/win32/IDocUIHandler.html&lt;/A&gt;&lt;BR&gt;
&lt;/P&gt;&lt;img src ="http://www.ailight.jp/blog/sha256/aggbug/13894.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>社本＠ワック</dc:creator><title>DirectX Trandform を使った画像の変換 - DirectX Transform</title><link>http://www.ailight.jp/blog/sha256/archive/2007/06/05/13891.aspx</link><pubDate>Tue, 05 Jun 2007 11:31:00 GMT</pubDate><guid>http://www.ailight.jp/blog/sha256/archive/2007/06/05/13891.aspx</guid><wfw:comment>http://www.ailight.jp/blog/sha256/comments/13891.aspx</wfw:comment><comments>http://www.ailight.jp/blog/sha256/archive/2007/06/05/13891.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.ailight.jp/blog/sha256/comments/commentRss/13891.aspx</wfw:commentRss><trackback:ping>http://www.ailight.jp/blog/sha256/services/trackbacks/13891.aspx</trackback:ping><description>&lt;P&gt;DirectX Trandform を使った画像の変換するコードが発掘されたので、&lt;BR&gt;抜粋を公開します。&lt;BR&gt;&lt;BR&gt;そもそも「DirectX Trandformって何？」っていう人も多いと&lt;BR&gt;思いますが、一言で説明すると"IEのCSSでのfilter"のことです。&lt;BR&gt;&lt;BR&gt;この DirectX Trandform の進化したものが、"WPF Bitmap Effects"に&lt;BR&gt;なります。&lt;BR&gt;WPFの基盤となる milcore の中で、唯一公開されているものだと思います。&lt;BR&gt;&lt;BR&gt;&lt;PRE&gt;---
_COM_SMARTPTR_TYPEDEF(IDXTransformFactory, __uuidof(IDXTransformFactory));
_COM_SMARTPTR_TYPEDEF(IDXTransform, __uuidof(IDXTransform));

_COM_SMARTPTR_TYPEDEF(IDXSurfaceFactory, __uuidof(IDXSurfaceFactory));
_COM_SMARTPTR_TYPEDEF(IDXSurface, __uuidof(IDXSurface));

_COM_SMARTPTR_TYPEDEF(IDXDCLock, __uuidof(IDXDCLock));


class CMainDlg :
 public CDialogImpl&lt;CMainDlg&gt;
{
 // 省略。。

public:
 BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam)
 {
  // 省略。。

  HRESULT hr = S_OK;
 
  // トランスフォームファクトリ
  hr = m_spDXTransformFactory.CreateInstance(CLSID_DXTransformFactory);
  if (FAILED(hr))
  {
   // 無視する。。
  }

  // サーフェスファクトリ
  hr = m_spDXTransformFactory-&gt;QueryService(
   SID_SDXSurfaceFactory, __uuidof(IDXSurfaceFactory), (void**)&amp;m_spDXSurfaceFactory);
  if (FAILED(hr))
  {
   // 無視する。。
  }

  // 入力用サーフェス
  CString strURL = _T("http://www.kanabo.net/images/header_logo.gif");
//  CString strURL = _T("c:\\windows\\winnt256.bmp");
  hr = m_spDXSurfaceFactory-&gt;LoadImage(
   T2W((LPTSTR)(LPCTSTR)strURL), NULL, NULL, &amp;DDPF_PMARGB32, __uuidof(IDXSurface), (void**)&amp;m_spInputDXSurface);
  if (FAILED(hr))
  {
   // 無視する。。
  }

  // 省略。。

  return TRUE;
 }

protected:
 static HRESULT OnDraw(HDC hDC, IDXSurfacePtr spInputDXSurface, IDXSurfaceFactoryPtr spDXSurfaceFactory, IDXTransformPtr spDXTransform = NULL)
 {
  if (spInputDXSurface == NULL)
  {
   ATLASSERT(0);
   return E_FAIL;
  }
  if (spDXSurfaceFactory == NULL)
  {
   ATLASSERT(0);
   return E_FAIL;
  }

  HRESULT hr = S_OK;

  // 入力用サーフェスの領域の取得
  CDXDBnds bnds;
      hr = spInputDXSurface-&gt;GetBounds(&amp;bnds);
  if (FAILED(hr))
  {
   return hr;
  }

  // 出力用サーフェス
  IDXSurfacePtr spOutputDXSurface;
  hr = spDXSurfaceFactory-&gt;CreateSurface(
   NULL, NULL, &amp;DDPF_PMARGB32, &amp;bnds, 0, NULL, __uuidof(IDXSurface), (void**)&amp;spOutputDXSurface);
 //  NULL, NULL, NULL, &amp;bnds, NULL, NULL, __uuidof(IDXSurface), (void**)&amp;spOutputDXSurface);
  if (FAILED(hr))
  {
   return hr;
  }

  // 出力用サーフェスに転送
  if (spDXTransform == NULL)
  {
   hr = spDXSurfaceFactory-&gt;BitBlt(spOutputDXSurface, NULL, spInputDXSurface, NULL, NULL);
   if (FAILED(hr))
   {
    return hr;
   }
  }
  else
  {
   // トランスフォーム準備
   IUnknown* pUnkInputs[1] = { IUnknownPtr(spInputDXSurface) };
   IUnknown* pUnkOutputs[1] = { IUnknownPtr(spOutputDXSurface) };
   hr = spDXTransform-&gt;Setup(pUnkInputs, 1, pUnkOutputs, 1, 0);
   if (FAILED(hr))
   {
    return hr;
   }

   // トランスフォーム実行
#if 0
   hr = spDXTransform-&gt;Execute(NULL, &amp;bnds, NULL);
#else
   CDXDVec vec(true);
   hr = spDXTransform-&gt;Execute(NULL, &amp;bnds, &amp;vec);
#endif
   if (FAILED(hr))
   {
    return hr;
   }
  }

  // 出力用サーフェスのＤＣをロック
  IDXDCLockPtr spDXDCLock;
  hr = spOutputDXSurface-&gt;LockSurfaceDC(NULL, INFINITE, DXLOCKF_READ, &amp;spDXDCLock);
  if (FAILED(hr))
  {
   return hr;
  }

  // 出力用サーフェスのＤＣを取得
  HDC hDstDC = spDXDCLock-&gt;GetDC();
  if (hDstDC == NULL)
  {
   return E_FAIL;
  }

  // 描画
  ::BitBlt(hDC, 0, 0, bnds.Width(), bnds.Height(), hDstDC, 0, 0, SRCCOPY);

  return S_OK
 }

protected:
 IDXSurfaceFactoryPtr m_spDXSurfaceFactory;
 IDXTransformFactoryPtr m_spDXTransformFactory;

 IDXSurfacePtr m_spInputDXSurface;
 IDXTransformPtr m_spDXTransform;
};
---
&lt;/PRE&gt;&lt;BR&gt;&lt;BR&gt;■Filters Overviews and Tutorials - MSDN&lt;BR&gt;&lt;A href="http://msdn2.microsoft.com/en-US/library/aa753539.aspx"&gt;http://msdn2.microsoft.com/en-US/library/aa753539.aspx&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;■WPF Bitmap Effects - MSDN&lt;BR&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/ms735322.aspx"&gt;http://msdn2.microsoft.com/en-us/library/ms735322.aspx&lt;/A&gt;&lt;BR&gt;
&lt;/P&gt;&lt;img src ="http://www.ailight.jp/blog/sha256/aggbug/13891.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>社本＠ワック</dc:creator><title>WAB API が廃止された？ - Windows Vista</title><link>http://www.ailight.jp/blog/sha256/archive/2007/05/28/13877.aspx</link><pubDate>Mon, 28 May 2007 11:45:00 GMT</pubDate><guid>http://www.ailight.jp/blog/sha256/archive/2007/05/28/13877.aspx</guid><wfw:comment>http://www.ailight.jp/blog/sha256/comments/13877.aspx</wfw:comment><comments>http://www.ailight.jp/blog/sha256/archive/2007/05/28/13877.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.ailight.jp/blog/sha256/comments/commentRss/13877.aspx</wfw:commentRss><trackback:ping>http://www.ailight.jp/blog/sha256/services/trackbacks/13877.aspx</trackback:ping><description>&lt;P&gt;以下のような質問メールが、Blog 経由できました。&lt;BR&gt;(公開は、本人の承諾を得ております)&lt;BR&gt;&lt;BR&gt;&amp;gt; はじめまして、検索でたどりつきました。&lt;BR&gt;&amp;gt; 直接Blogにコメントするか迷ったのですが、&lt;BR&gt;&amp;gt; こちら（メールフォーム）から質問することにします。&lt;BR&gt;&amp;gt;&lt;BR&gt;&amp;gt; 社本さんの06/12/05のWindows Contacts の記事を見ました。&lt;BR&gt;&amp;gt; 確かにいろいろ検索しても、Windows Contacts のサンプルは&lt;BR&gt;&amp;gt; （日本語では）見かけることができなかったので、非常に参考になります。&lt;BR&gt;&amp;gt;&lt;BR&gt;&amp;gt; 私は WinXP+VC6.0 でWABを開いて、そのWABからメアドを&lt;BR&gt;&amp;gt; 取得するPGMを作っていますが、Vistaでは開く際にエラーにな&lt;BR&gt;&amp;gt; ります。&lt;BR&gt;&lt;BR&gt;06/12/05 の記事にも書いていますが、Windows Vita では&lt;BR&gt;Windows Address Book (WAB) に代わり Windows Contacts が&lt;BR&gt;アドレス帳の管理を行うようになりました。&lt;BR&gt;&lt;BR&gt;しかし、互換性を考えるとAPIの廃止はしないではないかと&lt;BR&gt;予想していたので、エラーになるというのは意外でした。&lt;BR&gt;そこで、確認のために以下のようなコードを書いてみました。&lt;BR&gt;&lt;BR&gt;&lt;PRE&gt;
---
 HRESULT TestWab()
 {
  USES_CONVERSION;

  HRESULT hr = S_OK;

  CModule module;

  // ＤＬＬのキャッシュ
  CString strFileName = CWabHelper::GetWABDllPath();
  HINSTANCE hInst = module.LoadLibrary(strFileName);
  if (hInst == NULL)
  {
   return E_FAIL;
  }

  IAddrBookPtr spAddrBook;
  IWABObjectPtr spWABObject;
  CWabParam wabParam(m_hWnd);
  hr = thisClass::Probe_WABOpen(&amp;spAddrBook, &amp;spWABObject, &amp;wabParam, 0);
  if (FAILED(hr))
  {
   return hr;
  }

  ULONG cbEntryID = 0;
  LPENTRYID lpEntryID = NULL;
  hr = spAddrBook-&gt;GetPAB(&amp;cbEntryID, &amp;lpEntryID);
  if (FAILED(hr))
  {
   return hr;
  }

  ULONG ulObjType= 0;
  IABContainerPtr spABContainer;
  hr = spAddrBook-&gt;OpenEntry(cbEntryID, lpEntryID, NULL, 0, &amp;ulObjType, (LPUNKNOWN*)&amp;spABContainer);
  if (FAILED(hr))
  {
   // 無視する。。
  }

  thisClass::FreeBuffer(lpEntryID, spWABObject);

  IMAPITablePtr spMAPITable;
  hr = spABContainer-&gt;GetContentsTable(WAB_LOCAL_CONTAINERS, &amp;spMAPITable);
  if (FAILED(hr))
  {
   return hr;
  }

  hr = spMAPITable-&gt;SeekRow(BOOKMARK_BEGINNING, 0, NULL);
  if (FAILED(hr))
  {
   return hr;
  }

  ULONG ulCount = 0;
  hr = spMAPITable-&gt;GetRowCount(0, &amp;ulCount);
  if (FAILED(hr))
  {
   return hr;
  }

  for (ULONG i = 0; i &lt; ulCount; i++)
  {
   LPSRowSet lpSRowSet = NULL;
   hr = spMAPITable-&gt;QueryRows(1, 0, &amp;lpSRowSet);
   if (FAILED(hr))
   {
    ATLASSERT(0);
    continue;
   }

   // 省略。。

   thisClass::FreeBuffer(lpSRowSet, spWABObject);
  }

  return S_OK;
 }

 template &amp;lt;typename T&amp;gt;
 static HRESULT FreeBuffer(T* p, IWABObjectPtr spWABObject)
 {
  ATLASSERT(spWABObject != NULL);
  if (p == NULL)
  {
   return S_FALSE;
  }

  HRESULT hr = S_OK;

  hr = spWABObject-&gt;FreeBuffer(p);
  if (FAILED(hr))
  {
   // 無視する。。
  }

  return S_OK;
 }
 static HRESULT FreeBuffer(LPSRowSet lpSRowSet, IWABObjectPtr spWABObject)
 {
  ATLASSERT(spWABObject != NULL);
  if (lpSRowSet == NULL)
  {
   return S_FALSE;
  }

  HRESULT hr = S_OK;

  for (ULONG i = 0; i &lt; lpSRowSet-&gt;cRows; ++i)
  {
   const SRow&amp; SRow = lpSRowSet-&gt;aRow[i];

   hr = spWABObject-&gt;FreeBuffer(SRow.lpProps);
   if (FAILED(hr))
   {
    // 無視する。。
    continue;
   }
  }

  hr = spWABObject-&gt;FreeBuffer(lpSRowSet);
  if (FAILED(hr))
  {
   // 無視する。。
  }

  return S_OK;
 }

 static HRESULT Probe_WABOpen(
  LPADRBOOK *lppAdrBook,
  LPWABOBJECT *lppWABObject,
  LPWAB_PARAM lpWABParam = NULL,
  DWORD Reserved2 = 0)
 {
  HRESULT hr = S_OK;

  CModule module;

  CString strFileName = thisClass::GetWABDllPath();
  HINSTANCE hInst = module.LoadLibrary(strFileName);
  if (hInst == NULL)
  {
   return E_FAIL;
  }

  CString strProcName = _T("WABOpen");
  LPWABOPEN func = (LPWABOPEN)module.GetProcAddress(strProcName);
  if (func == NULL)
  {
   return E_NOTIMPL;
  }

  return func(lppAdrBook, lppWABObject, lpWABParam, Reserved2);
 }
 static HRESULT Probe_WABOpenEx(
  LPADRBOOK *lppAdrBook,
  LPWABOBJECT *lppWABObject,
  LPWAB_PARAM lpWABParam,
  DWORD Reserved2,
  ALLOCATEBUFFER *lpfnAllocateBuffer,
  ALLOCATEMORE *lpfnAllocateMore,
  FREEBUFFER *lpfnFreeBuffer)
 {
  HRESULT hr = S_OK;

  CModule module;

  CString strFileName = thisClass::GetWABDllPath();
  HINSTANCE hInst = module.LoadLibrary(strFileName);
  if (hInst == NULL)
  {
   return E_FAIL;
  }

  CString strProcName = _T("WABOpenEx");
  LPWABOPENEX func = (LPWABOPENEX)module.GetProcAddress(strProcName);
  if (func == NULL)
  {
   return E_NOTIMPL;
  }

  return func(lppAdrBook, lppWABObject, lpWABParam, Reserved2, lpfnAllocateBuffer, lpfnAllocateMore, lpfnFreeBuffer);
 }

 static CString GetWABDllPath()
 {
  CString strValue = CRegHelper::SHRegGetString(
   HKEY_LOCAL_MACHINE,
   WAB_DLL_PATH_KEY,
   _T(""));
  if (strValue.IsEmpty())
  {
   return WAB_DLL_NAME;
  }

  return strValue;
 }
 static CString GetCurrentVersion()
 {
  CString strValue = CRegHelper::SHRegGetString(
   HKEY_LOCAL_MACHINE,
   _T("SOFTWARE\\Microsoft\\WAB\\Version Info"),
   _T("Current"));
  return strValue;
 }
 static CString GetPreviousVersion()
 {
  CString strValue = CRegHelper::SHRegGetString(
   HKEY_LOCAL_MACHINE,
   _T("SOFTWARE\\Microsoft\\WAB\\Version Info"),
   _T("Previous"));
  return strValue;
 }
---
&lt;/PRE&gt;&lt;BR&gt;結論は。。上記のような単純なコードでは、大丈夫でした。&lt;BR&gt;もう少し、エラーの発生箇所を探ったほうがいいと思います。 &amp;gt; 質問者の方&lt;BR&gt;&lt;BR&gt;つづく。。&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;■Windows Contacts - Windows Vista - 社本＠ワック Blog&lt;BR&gt;&lt;A href="http://www.ailight.jp/blog/sha256/archive/2006/12/05/13399.aspx"&gt;http://www.ailight.jp/blog/sha256/archive/2006/12/05/13399.aspx&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;■DLLを扱うクラス (CModule) - for Programmers&lt;BR&gt;&lt;A href="http://www.wac-jp.com/programmers/win32/Module.html"&gt;http://www.wac-jp.com/programmers/win32/Module.html&lt;/A&gt;&lt;BR&gt;
&lt;/P&gt;&lt;img src ="http://www.ailight.jp/blog/sha256/aggbug/13877.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>社本＠ワック</dc:creator><title>x64版のMSXML4は、リリースされていない？</title><link>http://www.ailight.jp/blog/sha256/archive/2007/05/21/13868.aspx</link><pubDate>Mon, 21 May 2007 12:17:00 GMT</pubDate><guid>http://www.ailight.jp/blog/sha256/archive/2007/05/21/13868.aspx</guid><wfw:comment>http://www.ailight.jp/blog/sha256/comments/13868.aspx</wfw:comment><comments>http://www.ailight.jp/blog/sha256/archive/2007/05/21/13868.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.ailight.jp/blog/sha256/comments/commentRss/13868.aspx</wfw:commentRss><trackback:ping>http://www.ailight.jp/blog/sha256/services/trackbacks/13868.aspx</trackback:ping><description>&lt;P&gt;
x64版のMSXML4って、リリースされていないようですね。&lt;BR&gt;
リリースされた時期を考えれば、当然かもしれませんけど。&lt;BR&gt;
MSXML6は、x64の他にIA64もちゃんとリリースされています。&lt;BR&gt;
&lt;BR&gt;
MSXML4は、今年の10月～11月には Kill Bit が立てられて&lt;BR&gt;
IE上でオブジェクトが生成できなくなるなんて記事もあります。&lt;BR&gt;
そういう意味でも、MSXML6に移行したほうが良さそうですねぇ。&lt;BR&gt;
&lt;BR&gt;
&lt;BR&gt;
■Microsoft Core XML Services (MSXML) 6.0 - Microsoft&lt;BR&gt;
&lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyID=993c0bcf-3bcf-4009-be21-27e85e1857b1&amp;amp;DisplayLang=ja"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyID=993c0bcf-3bcf-4009-be21-27e85e1857b1&amp;amp;DisplayLang=ja&lt;/A&gt;&lt;BR&gt;
&lt;BR&gt;
■MSXML4 is going to be kill bit-ed - Microsoft XML Team's WebLog&lt;BR&gt;
&lt;A href="http://blogs.msdn.com/xmlteam/archive/2007/03/12/msxml4-is-going-to-be-kill-bit-ed.aspx"&gt;http://blogs.msdn.com/xmlteam/archive/2007/03/12/msxml4-is-going-to-be-kill-bit-ed.aspx&lt;/A&gt;&lt;BR&gt;
&lt;/P&gt;&lt;img src ="http://www.ailight.jp/blog/sha256/aggbug/13868.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>社本＠ワック</dc:creator><title>COMのレジストリ登録 その２ - Visual C++ 8.0 </title><link>http://www.ailight.jp/blog/sha256/archive/2007/05/08/13787.aspx</link><pubDate>Tue, 08 May 2007 10:46:00 GMT</pubDate><guid>http://www.ailight.jp/blog/sha256/archive/2007/05/08/13787.aspx</guid><wfw:comment>http://www.ailight.jp/blog/sha256/comments/13787.aspx</wfw:comment><comments>http://www.ailight.jp/blog/sha256/archive/2007/05/08/13787.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.ailight.jp/blog/sha256/comments/commentRss/13787.aspx</wfw:commentRss><trackback:ping>http://www.ailight.jp/blog/sha256/services/trackbacks/13787.aspx</trackback:ping><description>&lt;P&gt;
&amp;gt; しかし、VC8からは、ビルド後のイベントで登録するのではなく、&lt;BR&gt;
&amp;gt; リンカの全般にある"出力の登録"で設定するようになったようです。&lt;BR&gt;
&lt;BR&gt;
あ～、"ビルド後のイベント"でレジストリの登録を&lt;BR&gt;しなくなった理由が分かった気がします。&lt;BR&gt;
&lt;BR&gt;
&lt;BR&gt;
ビルド環境がx64 + ビルドしたDLLがx86の場合、&lt;BR&gt;単純に以下のようにコマンドラインを実行すると&lt;BR&gt;
x64版のregsvr32.exeが呼び出されてしまうため、&lt;BR&gt;レジストリ登録に失敗してしまいます。&lt;BR&gt;
(x64版のEXEは、x86版のDLLをロードできないため)&lt;BR&gt;
&lt;BR&gt;
regsvr32.exe /s /c "$(TargetPath)"&lt;BR&gt;
&lt;BR&gt;
&lt;BR&gt;
リンカの全般にある"出力の登録"は、それらを&lt;BR&gt;考慮に入れた上で、x64版とx86版のregsvr32.exeの&lt;BR&gt;呼び出しを行うんでしょうね。&lt;BR&gt;
&lt;BR&gt;
x64 : %WINDIR%System32\regsvr32.exe&amp;nbsp; &lt;BR&gt;x86 : %WINDIR%SysWOW64\regsvr32.exe&lt;BR&gt;
&lt;BR&gt;
&lt;BR&gt;
■COMのレジストリ登録 - Visual C++ 8.0 - 社本＠ワック Blog&lt;BR&gt;
&lt;A href="http://www.ailight.jp/blog/sha256/archive/2007/02/15/13583.aspx"&gt;http://www.ailight.jp/blog/sha256/archive/2007/02/15/13583.aspx&lt;/A&gt;&lt;BR&gt;
&lt;/P&gt;&lt;img src ="http://www.ailight.jp/blog/sha256/aggbug/13787.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>社本＠ワック</dc:creator><title>音声ファイルの再生 - Windows</title><link>http://www.ailight.jp/blog/sha256/archive/2007/04/06/13747.aspx</link><pubDate>Fri, 06 Apr 2007 07:31:00 GMT</pubDate><guid>http://www.ailight.jp/blog/sha256/archive/2007/04/06/13747.aspx</guid><wfw:comment>http://www.ailight.jp/blog/sha256/comments/13747.aspx</wfw:comment><comments>http://www.ailight.jp/blog/sha256/archive/2007/04/06/13747.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.ailight.jp/blog/sha256/comments/commentRss/13747.aspx</wfw:commentRss><trackback:ping>http://www.ailight.jp/blog/sha256/services/trackbacks/13747.aspx</trackback:ping><description>&lt;P&gt;音声ファイルの再生を行うコードです。&lt;BR&gt;&lt;BR&gt;CMediaControlMMクラスは、昔ながらの Multi Media API を&lt;BR&gt;使った実装で、WAVファイルの再生のみ対応しています。&lt;BR&gt;&lt;BR&gt;CMediaControlDSクラスは、Direct Show を使った実装なので、&lt;BR&gt;対応するデコーダが入っていれば何でも再生できます。&lt;BR&gt;Windows 98以上であれば、WMP6.4がインストールされているので、&lt;BR&gt;WAVだけでなくWMAやMP3ファイルの再生も標準で対応しています。&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;PRE&gt;---
#include &amp;lt;strmif.h&amp;gt;        // IGraphBuilder
#include &amp;lt;control.h&amp;gt;       // IMediaControl, IMediaEvent
#include &amp;lt;uuids.h&amp;gt;        // CLSID_FilterGraph
#pragma comment(lib, "strmiids.lib")

#include &amp;lt;Mmsystem.h&amp;gt;
#pragma comment(lib, "winmm.lib")

_COM_SMARTPTR_TYPEDEF(IGraphBuilder, __uuidof(IGraphBuilder));
_COM_SMARTPTR_TYPEDEF(IMediaControl, __uuidof(IMediaControl));
_COM_SMARTPTR_TYPEDEF(IMediaEvent, __uuidof(IMediaEvent));


//////////////////////////////////////////////////////////////////////
// CMediaControl
class CMediaControlDS
{
protected:
 typedef CMediaControlDS      thisClass;

public:
 CMediaControlDS()
 {
 }
 virtual ~CMediaControlDS()
 {
 }

public:
 HRESULT PlaySound(LPCTSTR szFileName)
 {
  USES_CONVERSION;

  HRESULT hr = S_OK;

  // 毎回、新しくオブジェクトを生成する
  // 再生中の場合、停止します
  m_spMediaControl = thisClass::CreateMediaControl();
  if (m_spMediaControl == NULL)
  {
   return E_FAIL;
  }

  IGraphBuilderPtr spGraphBuilder = m_spMediaControl;
  if (spGraphBuilder == NULL)
  {
   return E_FAIL;
  }

  hr = spGraphBuilder-&amp;gt;RenderFile(T2W((LPTSTR)szFileName), NULL);
  if (FAILED(hr))
  {
   return hr;
  }

  hr = m_spMediaControl-&amp;gt;Run();
  if (FAILED(hr))
  {
   return hr;
  }

  return hr;
 }
 HRESULT StopSound()
 {
  HRESULT hr = S_OK;

  if (m_spMediaControl == NULL)
  {
   return S_FALSE;
  }

  m_spMediaControl = NULL;

  return S_OK;
 }

protected:
 static IMediaControlPtr CreateMediaControl()
 {
  HRESULT hr = S_OK;

  IMediaControlPtr spMediaControl;
  hr = spMediaControl.CreateInstance(CLSID_FilterGraph);
  if (FAILED(hr))
  {
   return NULL;
  }

  return spMediaControl;
 }

protected:
 IMediaControlPtr m_spMediaControl;
};


//////////////////////////////////////////////////////////////////////
// CMediaControlMM

class CMediaControlMM
{
protected:
 typedef CMediaControlMM      thisClass;

public:
 CMediaControlMM()
 {
 }
 virtual ~CMediaControlMM()
 {
 }

public:
 HRESULT PlaySound(LPCTSTR szFileName)
 {
  DWORD dwSound = SND_ASYNC | SND_NODEFAULT | SND_NOWAIT;  // サウンドの種類
  BOOL br = ::PlaySound(szFileName, NULL, dwSound);
  if (br = FALSE)
  {
   DWORD dwError = ::GetLastError();
   return HRESULT_FROM_WIN32(dwError);
  }

  return S_OK;
 }
 HRESULT StopSound()
 {
  DWORD dwSound = 0;
  BOOL br = ::PlaySound(NULL, NULL, dwSound);
  if (br == FALSE)
  {
   DWORD dwError = ::GetLastError();
   return HRESULT_FROM_WIN32(dwError);
  }

  return S_OK;
 }
};

#ifdef _USE_MMAPI
#define CMediaControl       CMediaControlMM
#else
#define CMediaControl       CMediaControlDS
#endif
---
&lt;/PRE&gt;
&lt;/P&gt;&lt;img src ="http://www.ailight.jp/blog/sha256/aggbug/13747.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>