スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--.--.-- | スポンサー広告

COMプログラム~

今日は特に進捗はなし(_0_)



ATLを使用しないIEイベントの取得-2

今回はイベントシンククラスの実装を行っていきます。
といっても Invoke 以外は定型的なコードになります。

#include "stdafx.h"
#include "IEEventSink.h"

IEEventSink::IEEventSink() : m_nRefCnt(0)
{
}


IEEventSink::~IEEventSink()
{
m_nRefCnt = 0;
}


HRESULT STDMETHODCALLTYPE
IEEventSink::QueryInterface(REFIID riid, void **ppvObject)
{
if(IsEqualIID(riid, IID_IUnknown) ||
IsEqualIID(riid, IID_IDispatch))
*ppvObject = static_cast(this);
else
{
*ppvObject = NULL;
return E_NOINTERFACE;
}

// 参照カウンタをインクリメント
AddRef();
return S_OK;
}


ULONG STDMETHODCALLTYPE IEEventSink::AddRef(void)
{
m_nRefCnt++;
return m_nRefCnt;
}


ULONG STDMETHODCALLTYPE IEEventSink::Release(void)
{
m_nRefCnt--;
if(m_nRefCnt > 0)
return m_nRefCnt;

delete this;
return 0;
}


HRESULT STDMETHODCALLTYPE
IEEventSink::GetTypeInfoCount(unsigned int *pCount)
{
if(pCount == NULL){
return E_INVALIDARG;
}

*pCount = 1;
return NOERROR;
}


HRESULT STDMETHODCALLTYPE
IEEventSink::GetTypeInfo(unsigned int iTInfo,
LCID lcid,
ITypeInfo **ppTInfo)
{
if (ppTInfo == NULL)
return E_INVALIDARG;

*ppTInfo = NULL;

if(iTInfo != 0)
return DISP_E_BADINDEX;

m_pTInfo->AddRef();

*ppTInfo = m_pTInfo;
return NOERROR;
}


HRESULT STDMETHODCALLTYPE
IEEventSink::GetIDsOfNames(REFIID riid, OLECHAR **rgszNames,
unsigned int cNames,
LCID lcid, DISPID *rgDispId)
{
return DispGetIDsOfNames(m_pTInfo, rgszNames, cNames, rgDispId);
}


HRESULT STDMETHODCALLTYPE
IEEventSink::Invoke(DISPID dispIdMember,
REFIID riid, LCID lcid,
WORD wFlags,
DISPPARAMS *pDispParams,
VARIANT *pVarResult,
EXCEPINFO *pExcepInfo,
unsigned int *puArgErr)
{
switch(dispIdMember)
{
/* HTML ドキュメントの表示完了 */
case DISPID_DOCUMENTCOMPLETE:
::MessageBox(NULL, "読み込み終了", "メッセージ", MB_OK);
break;

/* ステータス変更時 */
case DISPID_STATUSTEXTCHANGE:
{
char buffer[256] = "";
wcstombs(buffer, pDispParams->rgvarg[0].bstrVal, 256);
if(strcmp(buffer , ""))
::MessageBox(NULL, buffer, "URL", MB_OK);

break;
}

/* IE のクローズ */
case DISPID_ONQUIT:
::MessageBox(NULL, "IE の終了", "メッセージ", MB_OK);
break;

default:
break;
}

return S_OK;
}


void IEEventSink::CreateInstance(IDispatch **ppDispatch)
{
IEEventSink *ie_event;
ie_event = new IEEventSink;
ie_event->QueryInterface(IID_IDispatch, (void **)ppDispatch);
}

Ivoke 以外の関数の説明は省きます。

※詳しく知りたい方はこちらを参照~
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpdnguion/htm/msdn_drguion020298.asp

Ivoke についても細かい仕様は MSDN ↓
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/automat/htm/chap5_61id.asp

にお任せするとして……簡単に説明すると
第1引数にイベント DISPID が、
第5引数にイベントのパラメータが付随されてきます。
パラメータはイベント DISPID によって異なってくるので
各イベントシンクインターフェイスを参照してください。

IE のイベントシンクインターフェイスは↓
http://msdn.microsoft.com/workshop/browser/webbrowser/reference/ifaces/dwebbrowserevents2/dwebbrowserevents2.asp

次回に続く

スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ

2005.10.18 | Comments(0) | Trackback(0) | プログラム

コメント

コメントの投稿


秘密にする

«  | HOME |  »

ブロとも申請フォーム

この人とブロともになる

カウンター


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。