青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運轉,開心的工作
簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

COM callback notify HTML 的兩種方法

Posted on 2009-09-11 14:25 S.l.e!ep.¢% 閱讀(702) 評論(0)  編輯 收藏 引用 所屬分類: COM

COM callback notify HTML 的兩種方法

方法1:
1. Create ATL Project
2. New ATL Object...
3. Simple Object? -> Next
4. Attributes --> choose? 'Support ISupportErrorInfo'?? == you can throw some exception in COM
??? Attributes --> choose 'Support Connection Points'
5. RightClick? VC6 - IDE? Class Name? --> Implement Connection Point
??? Interfaces will display '_xxxxEvents'? <--- Choose it , Click OK
6. VC6 IDE Will Create A New Class named 'CProxy_IxxxxxEvents'
7. Add Your Methods

// CSDN.idl : IDL source for CSDN.dll
//

// This file will be processed by the MIDL tool to
// produce the type library (CSDN.tlb) and marshalling code.

import "oaidl.idl";
import "ocidl.idl";
?[
??object,
??uuid(2EE8F461-7200-4C13-A2FC-2552F8773089),
??dual,
??helpstring("IA Interface"),
??pointer_default(unique)
?]
?interface IA : IDispatch
?{

?[id(1), helpstring("method Init")] HRESULT Init();
?
};

?[
??object,
??uuid(C5C88155-7CAB-4109-9610-234A6AD529DC),
??dual,
??helpstring("IEvent Interface"),
??pointer_default(unique)
?]

?interface IEvent :? IUnknown
?{
??[id(1), helpstring("method OnDataChanged")] HRESULT OnDataChanged();
?};

[
?uuid(477B6435-238C-43AF-95DA-2F890256DF43),
?version(1.0),
?helpstring("CSDN 1.0 Type Library")
]
library CSDNLib
{
?importlib("stdole32.tlb");
?importlib("stdole2.tlb");

?[
??uuid(1FBB2F1E-E12E-4CE6-88EA-704E1CAE1091),
??helpstring("A Class")
?]
?coclass A
?{
??[default] interface IA;
??[source]? interface IEvent;
?
};
};//end


------

其中紅色代碼為手工添加.IEvent UUID由GUIDGEN.EXE生成.IEvent 添加方法OnDataChanged.在客戶端調用時添加功能代碼,我們將在接口IEvent的Init方法中回調其方法。此處為Connection Point之精粹.在ActiveX中事件的實現方法也以此技術為基礎.

3.編譯程序后,點擊COM對象Implement Connection Point...選項后,選中IEvent。則ATL向導將為我們生成新的實現聯接點的COM對象CA。

class ATL_NO_VTABLE CA :
?public CComObjectRootEx<CComSingleThreadModel>,
?public CComCoClass<CA, &CLSID_A>,
?public IDispatchImpl<IA, &IID_IA, &LIBID_CSDNLib>,
?public CProxyIEvent< CA >,
?public IConnectionPointContainerImpl<CA>

4.實現IA接口的Init方法

STDMETHODIMP CA::Init()
{
?AFX_MANAGE_STATE(AfxGetStaticModuleState())

?Fire_OnDataChanged();

?return S_OK;
}

編譯程序后,COM服務器的編碼寫成.

COM客戶端實現:

1.實現接收器類

http://study.feloo.com/Event.h/default.htm

class CEvent? : public IEvent
{
public:
// IUnknown
?ULONG __stdcall AddRef();
?ULONG __stdcall Release();
?HRESULT __stdcall QueryInterface(REFIID iid, void** ppv);
//IEvent
public:
?STDMETHOD(OnDataChanged)();
public:
?CEvent():m_cRef(0){}
?virtual ~CEvent(){}
private:
?long m_cRef;
};//end

//Event.cpp

ULONG CEvent::AddRef()

{
?return InterlockedIncrement(&m_cRef);
}

ULONG CEvent::Release()
{
?if (InterlockedDecrement(&m_cRef) != 0)
??return m_cRef;
?delete this;
?return 0;
}

HRESULT CEvent::QueryInterface(REFIID riid, void** ppv)
{
?if (riid == IID_IUnknown)
?{
??*ppv = (IUnknown*)this;
?}
?else if (riid == IID_IEvent)
?{
??*ppv = (IEvent*)this;
?}
?else
?{
??*ppv = NULL;
??return E_NOINTERFACE;
?}
?AddRef();
?return S_OK;
}

STDMETHODIMP CEvent::OnDataChanged()
{
?AfxMessageBox(_T("OnDataChanged!"));
?return S_OK;
}

//end

在CEvent::OnDataChanged()中添加的實現將由接口IA的Init方法回調。

2.客戶端實現代碼

void CCSDNClientDlg::OnButton1()

{

?CoInitialize(NULL);

?IA* pIA = NULL;
?CEvent* pEvent = NULL;
?HRESULT hr = CoCreateInstance(CLSID_A,NULL,
?????????CLSCTX_INPROC_SERVER,
?????????IID_IA,
?????????(void**)&pIA);


?if ( FAILED(hr) )
?{
??AfxMessageBox("Initalize com failed!");
??return ;
?} // if?????

?IConnectionPointContainer* pConnectionPointContainer = NULL;???
?IConnectionPoint* pConnectionPoint = NULL ;


?pEvent= new CEvent();
?pEvent->AddRef();

?DWORD dwCookie;

??? hr = pIA->QueryInterface(IID_IConnectionPointContainer, (void**)?? &pConnectionPointContainer);????
??? //IRecord->Release();
?ASSERT(SUCCEEDED(hr));

??hr = pConnectionPointContainer->FindConnectionPoint(IID_IEvent, &pConnectionPoint);

?ASSERT(SUCCEEDED(hr));
?ConnectionPoint->Advise((IUnknown*)pEvent, &dwCookie);????
?pConnectionPoint->Release();????


??hr = pIA->Init();//此處將激發事件OnDataChanged()

?ASSERT(SUCCEEDED(hr));

????? hr = pConnectionPointContainer->FindConnectionPoint(IID_IEvent, &pConnectionPoint);?

?ASSERT(SUCCEEDED(hr));
?pConnectionPoint->Unadvise(dwCookie);????
pConnectionPoint->Release();

?pConnectionPointContainer->Release();
?pIA->Release();

?pEvent->Release();
//?delete pEvent;

?CoUninitialize();
}

//end

文筆不好,見諒了!

完成 com? 之后,就可以在 html 加上

<SCRIPT ID=EventHandler FOR="xxxx" EVENT="OnTest(a, b)">
alert(a);??
</SCRIPT>
來響應了, 但這種方法只適用于

<OBJECT style="display:none;" TYPE="application/x-oleobject" classid=clsid:91443C71-B7DD-49F5-9F86-A2D305CED76A CODEBASE="abc.cab#Version=1,0,0,001"></OBJECT>??

如果在 HTML 是通過 new ActiveXObject 來創建 COM 的, 那么則需要用第二種方法
---------------------

方法二:

在htm中接受com控件發出的事件(VC/MFC ATL/ActiveX/COM


我為客戶做了一個com控件有一些事件(如OnStateChange)發出,客戶要求用htm調用。
一開始,一切正常htm中調用代碼如下:

<OBJECT ID="DvdPlayCtl" CLASSID="CLSID:EE9626A3-976C-470C-8282-07AB2FE2F85F"></OBJECT>

<SCRIPT language="JavaScript">

DvdPlayCtl.
attachEvent("OnStateChange", MyOnStateChange);

function MyOnStateChange(state,info)
{
alert("state change to "+state+" ,"+info);
}
</script>
則一旦com的狀態發生改變就發出OnStateChange事件,htm就可以正常接受并提示,但后來客戶要求用
另一種方式聲明com控件,代碼如下:

<SCRIPT language="JavaScript">
var DvdPlayCtl = new ActiveXObject("DvdPlayCtl.DvdPlayCtl");
</script>
即動態生成此com控件,則運行htm時以前的代碼DvdPlayCtl.attachEvent部分出錯:“對象不支持此操作”


1、在com中增加一個屬性OnStateChange,其類型為IDispatch *并為其添加put方法。

2、在put方法的實現中將傳進的DISPATCH型指針賦給自己的成員變量IDispatch *m_pDispatch。

STDMETHODIMP CDvdPlayCtl::put_OnStateChange(IDispatch *newVal)
{
// TODO: Add your implementation code here
m_pDispatch = newVal;
return S_OK;
}

3、定義成員函數void Send_Event(int state, TCHAR * info);在發送事件的函數中添加以下代碼:
if (m_pDispatch != NULL)
{
CComVariant* pvars = new CComVariant[2];

pvars[1] = state;//回調函數的第一個參數
pvars[0] = info;//回調函數的第二個參數

DISPPARAMS disp = { pvars, NULL, 2, 0 };
HRESULT hr = m_pDispatch->Invoke(0, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL);
delete[] pvars;
}
注意:
1、pvars的填充與函數參數順序是相反的
4、在htm中如下調用
<script language="JavaScript">

var DvdPlayCtl = new ActiveXObject("DvdPlayCtl.DvdPlayCtl");

DvdPlayCtl.OnStateChange = OnStateChange;
DvdPlayCtl.OnError = OnError;

function OnStateChange(state,info)
{
alert("state change to "+state+" ,"+info);
}
</script>



?

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美一区激情| 亚洲人成在线观看一区二区| 亚洲日本欧美天堂| 欧美精品1区2区| 亚洲精一区二区三区| 欧美黄色影院| 欧美成人网在线| 亚洲一区二区三区四区五区午夜 | 国产亚洲一二三区| 久久久久国产一区二区三区| 久久久久国产成人精品亚洲午夜| 又紧又大又爽精品一区二区| 欧美激情一区二区三区| 欧美日韩在线另类| 欧美在线免费观看| 另类亚洲自拍| 亚洲欧美春色| 久久综合久久88| 亚洲一品av免费观看| 欧美一区二区视频免费观看| 亚洲破处大片| 亚洲一区二区网站| 亚洲国产精品精华液网站| 99日韩精品| 亚洲国产成人精品视频| 亚洲视频在线播放| 91久久夜色精品国产九色| 亚洲私人影吧| 亚洲精品国久久99热| 香蕉久久夜色| 亚洲视频在线观看| 久久一区免费| 久久国产毛片| 欧美三级在线视频| 欧美高清不卡| 国产有码一区二区| 一区二区成人精品 | 欧美精品激情在线| 久久手机精品视频| 国产精品va| 91久久在线播放| 永久免费精品影视网站| 亚洲一区二区三区午夜| 亚洲看片一区| 欧美成人亚洲成人日韩成人| 久久久久久久欧美精品| 欧美性大战久久久久久久| 亚洲夫妻自拍| 亚洲日韩欧美视频一区| 久久久91精品国产| 久久久国产成人精品| 国产精品久久久久av| 亚洲国产欧美日韩精品| 在线看片日韩| 久久久亚洲国产天美传媒修理工 | 久久午夜羞羞影院免费观看| 国产精品捆绑调教| 在线一区二区三区四区| 亚洲天天影视| 国产精品福利久久久| 亚洲精品国产无天堂网2021| 亚洲三级毛片| 欧美激情第二页| 亚洲欧洲日夜超级视频| 日韩视频在线观看国产| 欧美精品电影| 日韩视频在线你懂得| 亚洲视频二区| 国产精品久久激情| 午夜精品久久久久| 久久久久久9999| 影音先锋亚洲精品| 鲁大师影院一区二区三区| 亚洲成在人线av| 亚洲理论在线| 欧美视频在线一区| 亚洲女优在线| 久久最新视频| 91久久国产精品91久久性色| 欧美激情中文不卡| 一区二区三区高清视频在线观看| 亚洲欧美激情诱惑| 国产性猛交xxxx免费看久久| 久久综合狠狠综合久久激情| 亚洲第一福利社区| 午夜精品久久久久久久| 国内精品久久久久久久影视蜜臀| 久久精品三级| 亚洲精品系列| 久久精品国产亚洲一区二区| 亚洲高清色综合| 欧美婷婷在线| 久久精品日产第一区二区三区| 亚洲激情二区| 欧美呦呦网站| 亚洲黄色免费网站| 国产精品一区毛片| 老司机精品视频网站| 一本色道久久综合狠狠躁的推荐| 久久久久99精品国产片| 亚洲精品日韩欧美| 国产精品一区视频| 欧美二区不卡| 久久精品国产99精品国产亚洲性色| 亚洲国产精品一区二区久| 欧美一区二区私人影院日本| 91久久中文| 国产视频一区二区三区在线观看| 欧美成人精品在线| 欧美一级欧美一级在线播放| 91久久精品日日躁夜夜躁欧美| 欧美主播一区二区三区美女 久久精品人| 在线成人av| 国产精品一区视频网站| 欧美精品福利在线| 麻豆91精品| 久久av一区二区三区| 一本色道久久88综合日韩精品| 男女av一区三区二区色多| 校园春色国产精品| 在线视频精品一区| 亚洲精品乱码久久久久久黑人 | 国产精品久久久久久久7电影| 蜜臀久久99精品久久久画质超高清| 亚洲综合好骚| 正在播放亚洲一区| 亚洲精品日韩在线| 亚洲丰满在线| 亚洲国产成人精品久久久国产成人一区 | 日韩亚洲欧美成人一区| 极品裸体白嫩激情啪啪国产精品| 国产精品jvid在线观看蜜臀| 欧美日韩精品一区二区三区| 美脚丝袜一区二区三区在线观看 | 性久久久久久久久久久久| 日韩一级二级三级| 亚洲精品在线观| 亚洲国产欧美精品| 亚洲国产天堂久久国产91| 免费一级欧美片在线播放| 久久久久九九视频| 狂野欧美激情性xxxx| 久久综合亚洲社区| 麻豆国产精品一区二区三区| 久久免费高清| 女生裸体视频一区二区三区| 欧美大片在线观看一区| 欧美国产视频日韩| 亚洲国产一区二区三区在线播| 欧美激情欧美狂野欧美精品| 亚洲第一天堂av| 91久久久久久国产精品| 日韩一级欧洲| 亚洲一区二区三区在线视频| 午夜精品久久久久影视| 久久都是精品| 欧美成人免费全部观看天天性色| 免费不卡中文字幕视频| 欧美人与性动交a欧美精品| 欧美日韩国产成人精品| 国产精品高清一区二区三区| 国产伦精品一区二区三| 国外成人在线视频| 91久久国产综合久久蜜月精品| 亚洲美女毛片| 小处雏高清一区二区三区| 久久久噜噜噜久久中文字幕色伊伊 | 亚洲欧美日韩精品久久奇米色影视| 性欧美精品高清| 久久夜色精品国产亚洲aⅴ| 欧美韩日一区| 亚洲一区二区网站| 浪潮色综合久久天堂| 欧美日韩国产精品自在自线| 国产人成精品一区二区三| 一区二区亚洲精品| 夜夜精品视频一区二区| 久久av一区二区三区漫画| 欧美sm极限捆绑bd| 亚洲视频视频在线| 久久久久久亚洲精品不卡4k岛国| 欧美久久久久中文字幕| 国产偷自视频区视频一区二区| 亚洲精品欧美极品| 久久久xxx| 一本久久a久久免费精品不卡| 欧美在线精品免播放器视频| 欧美激情一区二区三区不卡| 国产日韩欧美高清| 亚洲作爱视频| 欧美福利视频在线| 久久国产一区二区| 欧美体内she精视频| 亚洲国产小视频在线观看| 欧美在线精品免播放器视频| 日韩亚洲成人av在线| 玖玖国产精品视频| 国产亚洲美州欧州综合国| 亚洲午夜视频在线| 亚洲国产日韩综合一区|