activex源碼
1. activex部件不能創建對象:'getobject'代碼:800A01AD,請問怎麼解決
在運行中輸入:regsvr32 scrrun.dll
2. 彈出"已限制此網頁運行可以訪問計算機的腳本或activex控制項「自動運行的源碼!
關閉彈出窗口阻止程序試試
3. ActiveX技術的ActiveX的概念
首先,ActiveX是一種標准。使用這個標准可以使用不同語言開發的軟體構件在網路環境中相互操作。它使得Internet超越靜態文本,利用多媒體效果和可交互的對象,向用戶提供更加主動有趣和更加有用的服務。另外,ActiveX也是開放技術的集合,它涵蓋了所有流行的Internet標准、語言和平台。通過連接Sun公司的Java技術和微軟公司的OLE組件技術,ActiveX給用戶和開發商提供了一個內容豐富的平台,在開發Internet新的應用程序的同時,可以保護他們以前在應用程序、工具和源碼上的投資。ActiveX標准包括控制項(Controls)、文檔(Documents)、腳本(Scripts)這三種最常用的技術,同時它也包括客戶機技術、伺服器技術以及工具和應用程序。下面分別介紹:
* ActiveX控制項
以前被稱為OLE控制項或OCX控制項,現在發展為能夠運行在Web頁面上的軟體構件。它提供了一些可交互的用戶控制功能,能夠使用戶不必打開其他應用程序,在Web瀏覽器中看到動畫、影像,聽到音樂。ActiveX控制項的一個主要優點是:它也能在當前許多流行的編程語言所寫的應用程序中重用。如: Java,Visual Basic,Visual C++等。目前,已有1000多個ActiveX控制項可以使用,范圍從小的定時器控制項到字處理器甚至Internet瀏覽器。
* ActiveX腳本
支持許多流行的腳本語言,包括Visual Basic Script 和JavaScript。腳本提供了在一個頁面中多個對象交互的功能,如ActiveX控制項,Java applets,ActiveX Documents。其中VisualBasic Script是一個用於編寫活動內容部件和Web頁面的Visual Basic優化版本。開發人員能夠用它來鏈接和自動生成ActiveX控制項或Javaapplets之類的程序部件,使之能夠包含腳本所規定的動作。
* ActiveX文檔
能使你在Web瀏覽器中看到非HTML格式文檔,例如Microsoft Excel,Word或Visio文件。
* Java虛機器
能使任何支持ActiveX的瀏覽器,例如:Internet Explorer3.0,運行Java applets並且將ActiveX控制項和Java applets集成。
* ActiveX伺服器構架
提供了許多基於Web伺服器的功能,例如:安全機制、資料庫訪問等。目前,已有超過100家公司宣布支持ActiveX技術,並著手開發基於ActiveX的工具、應用程序以及控制項。另外,ActiveX也將被幾種主要的操作系統支持,包括Window 95,Windows NT,Macintosh,Unix。這不僅能給用戶選擇平台的自由,而且也為ActiveX成為一種真正的分布式對象技術鋪平道路。
4. 想要個能修改Hosts文件的OCX或者ActiveX控制項!!需要有源代碼的
怎麼修改?修改哪個IP地址?
5. 如何動態載入ActiveX控制項
使用ON_EVENT_RANGE就足以滿足需要了,不過,還是希望能夠更靈活的實現動態的響應,所以又經過對MFC源碼一番探查,發現還是可以的,而且應該也不是很復雜的,下面分別來說說這兩種方法
常式為Tdax,對話框程序,使用了Microsoft UpDown Control 6.0控制項作為控制項,添加了MouseDown事件
第一種方法挺簡單的:
1.
預設的映射定義為
BEGIN_EVENTSINK_MAP(CTdaxDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CTdaxDlg)
ON_EVENT(CTdaxDlg, IDC_UPDOWN1, -605 /* MouseDown */, OnMouseDownUpdown1, VTS_I2 VTS_I2 VTS_I4 VTS_I4)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
現改為
BEGIN_EVENTSINK_MAP(CTdaxDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CTdaxDlg)
//}}AFX_EVENTSINK_MAP
ON_EVENT_RANGE(CTdaxDlg, IDC_UPDOWN1, IDC_UPDOWN1+10, -605 /* MouseDown */, OnMouseDownUpdown1, VTS_I4 VTS_I2 VTS_I2 VTS_I4 VTS_I4)
END_EVENTSINK_MAP()
就是說,可以映射至少11個控制項(請注意,這里用了至少,也就是說可以少於11個,甚至於1個也無所謂)
a.這里建議把ON_EVENT_RANGE從
//{{AFX_EVENTSINK_MAP(CTdaxDlg)
ON_EVENT_RANGE(CTdaxDlg, IDC_UPDOWN1, IDC_UPDOWN1+10, -605 /* MouseDown */, OnMouseDownUpdown1, VTS_I4 VTS_I2 VTS_I2 VTS_I4 VTS_I4)
//}}AFX_EVENTSINK_MAP
對中拖出來,見上面例子,不拖出來不會對程序產生影響,但可能會影響後續的IDE操作,試試便知。
b.最後的參數類型中要在前面加上VTS_I4,即從VTS_I2 VTS_I2 VTS_I4 VTS_I4變為VTS_I4 VTS_I2 VTS_I2 VTS_I4 VTS_I4,當然事件處理函數也將做相應調整,下面馬上講到。
2.
修改框架建立的事件處理函數
void OnMouseDownUpdown1(short Button, short Shift, long x, long y);
改為
BOOL OnMouseDownUpdown1(UINT nID, short Button, short Shift, long x, long y);
返回類型為void,應該也無所謂的,不過msdn上說是BOOL,咱就BOOL吧,但UINT nID這個參數是一定要加上的
3.做一些於本案無關的工作
a.在對話框編輯器中刪掉原來的ID為IDC_UPDOWN1的控制項
b.加一個成員變數CObList m_oaUpdowns;
c.在OnInitDialog中,加上
UINT nID = IDC_UPDOWN1;
CRect rect(10, 10, 20, 30);
for(int i=0; i<11; i++){
CUpDown* pupdown = new CUpDown;
rect.OffsetRect(0, 20);
pupdown->Create(NULL, WS_CHILD | WS_VISIBLE, rect, this, nID + i);
m_oaUpdowns.Add(pupdown);
}
d.在OnDestroy中,加上
for(int i=0; i<m_oaUpdowns.GetSize(); i++){
delete m_oaUpdowns[i];
}
e.在OnMouseDownUpdown1中,加上
CString str;
str.Format("%d", nID);
MessageBox(str);
用來指示是否收到事件
4.編譯一下,可以發現,絕對OK
下面,我們來看更多靈活的方法:
觀察MFC宏
BEGIN_EVENTSINK_MAP,END_EVENTSINK_MAP和ON_EVENT,可以發現MFC將控制項ID,事件ID和事件處理函數等等信息都放在AFX_EVENTSINKMAP_ENTRY這個結構,每個映射一個這種結構,所有的結構組成一數組放在AFX_EVENTSINKMAP結構中,本來以為動態修改這兩個結構信息,不就可以實現動態映射控制項事件了,可惜發現MFC定義了
const AFX_EVENTSINKMAP_ENTRY theClass::_eventsinkEntries[] =
{
...
}
可惡的const,只好另想它途了。
繼續觀察MFC源碼,發現它中間會有一個
BOOL CCmdTarget::OnEvent(UINT idCtrl, AFX_EVENT* pEvent,
AFX_CMDHANDLERINFO* pHandlerInfo)
{
...
}
函數中有如下代碼
VARIANT var;
AfxVariantInit(&var);
DISPPARAMS dispparams;
dispparams.rgvarg = NULL;
if (bRange)
{
memcpy(&dispparams, pEvent->m_pDispParams, sizeof(DISPPARAMS));
dispparams.rgvarg = new VARIANT[++dispparams.cArgs];
memcpy(dispparams.rgvarg, pEvent->m_pDispParams->rgvarg,
sizeof(VARIANT) * (dispparams.cArgs-1));
VARIANT* pvarID成都高級辦公軟體培訓班學習http://www.yingtaow.com?&dispparams.rgvarg[dispparams.cArgs-1];
V_VT(pvarID) = VT_I4;
V_I4(pvarID) = idCtrl;
}
hResult = CallMemberFunc(&pEntry->dispEntry, DISPATCH_METHOD, &var,
(bRange ? &dispparams : pEvent->m_pDispParams), &uArgError);
ASSERT(FAILED(hResult) || (V_VT(&var) == VT_BOOL));
bHandled = V_BOOL(&var);
if (bRange)
delete [] dispparams.rgvarg;
break;
好了,切入口找到了,就用這個CallMemberFunc了,唯一的問題就是重新組織這個函數所需的參數了。
開始:
1.為避免干擾,乾脆注釋掉OnInitDialog上一例中添加的代碼,再加入如下代碼:
UINT nID = 10004;
CRect rect(10, 10, 20, 30);
for(int i=0; i<11; i++){
CUpDown* pupdown = new CUpDown;
rect.OffsetRect(0, 20);
pupdown->Create(NULL, WS_CHILD | WS_VISIBLE, rect, this, nID + i);
m_oaUpdowns.Add(pupdown);
}
其實就改了一個nID,之所以改nID,是為了表示這個ID是可以你自己動態確定的,當然這里省事,將這些ID連在了一起,其實分開也是沒問題的。
2.注釋掉事件映射
BEGIN_EVENTSINK_MAP(CTdaxDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CTdaxDlg)
//}}AFX_EVENTSINK_MAP
// ON_EVENT_RANGE(CTdaxDlg, IDC_UPDOWN1, IDC_UPDOWN1+10, -605 /* MouseDown */, OnMouseDownUpdown1, VTS_I4 VTS_I2 VTS_I2 VTS_I4 VTS_I4)
END_EVENTSINK_MAP()
3.重載對話框的OnCmdMsg,加入代碼如下:
if(nCode == CN_EVENT && nID >= 10004 && nID <= 10014){
AFX_EVENT* pEvent = (AFX_EVENT*)pExtra;
if(pEvent != NULL && pEvent->m_dispid == -605){//根據dispid來判斷是否正確的事件
AFX_DISPMAP_ENTRY e;
e.lpszName = _T("");
e.lDispID = -605; //dispID,事件的dispID
e.vt = VT_BOOL; //返回類型
e.pfn = (AFX_PMSG)OnMouseDownUpdown1;//事件處理函數
e.pfnSet = (AFX_PMSG)0;
e.nPropOffset = 0;
e.flags = afxDispCustom;
//下面是參數類型,如果事件處理函數不加控制項ID的話,應該改為VTS_I2 VTS_I2 VTS_I4 VTS_I4
e.lpszParams = VTS_I4 VTS_I2 VTS_I2 VTS_I4 VTS_I4;
UINT uArgError = (UINT)-1; // no error yet
VARIANT var;
AfxVariantInit(&var);
//如果需要每個控制項的ID信息,應該為框架生成的事件處理函數的參數最前面加上1個UINT nID參數,代碼如下:
DISPPARAMS dispparams;
dispparams.rgvarg = NULL;
memcpy(&dispparams, pEvent->m_pDispParams, sizeof(DISPPARAMS));
dispparams.rgvarg = new VARIANT[++dispparams.cArgs];
memcpy(dispparams.rgvarg, pEvent->m_pDispParams->rgvarg,
sizeof(VARIANT) * (dispparams.cArgs-1));
VARIANT* pvarID = &dispparams.rgvarg[dispparams.cArgs-1];
pvarID->vt = VT_I4;
pvarID->intVal = nID;
CallMemberFunc(&e, DISPATCH_METHOD, &var,
&dispparams, &uArgError);
delete []dispparams.rgvarg;
//如果不需要控制項的ID信息,代碼如下,不過函數就不用加上第1個參數(控制項ID)了:
/* CallMemberFunc(&e, DISPATCH_METHOD, &var,
(pEvent->m_pDispParams), &uArgError);*/
}
return TRUE;
}
return CDialog::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
4.編譯運行,OK了。
常式為Tdax,對話框程序,使用了Microsoft UpDown Control 6.0控制項作為控制項,添加了MouseDown事件
第一種方法挺簡單的:
1.
預設的映射定義為
BEGIN_EVENTSINK_MAP(CTdaxDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CTdaxDlg)
ON_EVENT(CTdaxDlg, IDC_UPDOWN1, -605 /* MouseDown */, OnMouseDownUpdown1, VTS_I2 VTS_I2 VTS_I4 VTS_I4)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
現改為
BEGIN_EVENTSINK_MAP(CTdaxDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CTdaxDlg)
//}}AFX_EVENTSINK_MAP
ON_EVENT_RANGE(CTdaxDlg, IDC_UPDOWN1, IDC_UPDOWN1+10, -605 /* MouseDown */, OnMouseDownUpdown1, VTS_I4 VTS_I2 VTS_I2 VTS_I4 VTS_I4)
END_EVENTSINK_MAP()
就是說,可以映射至少11個控制項(請注意,這里用了至少,也就是說可以少於11個,甚至於1個也無所謂)
a.這里建議把ON_EVENT_RANGE從
//{{AFX_EVENTSINK_MAP(CTdaxDlg)
ON_EVENT_RANGE(CTdaxDlg, IDC_UPDOWN1, IDC_UPDOWN1+10, -605 /* MouseDown */, OnMouseDownUpdown1, VTS_I4 VTS_I2 VTS_I2 VTS_I4 VTS_I4)
//}}AFX_EVENTSINK_MAP
對中拖出來,見上面例子,不拖出來不會對程序產生影響,但可能會影響後續的IDE操作,試試便知。
b.最後的參數類型中要在前面加上VTS_I4,即從VTS_I2 VTS_I2 VTS_I4 VTS_I4變為VTS_I4 VTS_I2 VTS_I2 VTS_I4 VTS_I4,當然事件處理函數也將做相應調整,下面馬上講到。
2.
修改框架建立的事件處理函數
void OnMouseDownUpdown1(short Button, short Shift, long x, long y);
改為
BOOL OnMouseDownUpdown1(UINT nID, short Button, short Shift, long x, long y);
返回類型為void,應該也無所謂的,不過msdn上說是BOOL,咱就BOOL吧,但UINT nID這個參數是一定要加上的
3.做一些於本案無關的工作
a.在對話框編輯器中刪掉原來的ID為IDC_UPDOWN1的控制項
b.加一個成員變數CObList m_oaUpdowns;
c.在OnInitDialog中,加上
UINT nID = IDC_UPDOWN1;
CRect rect(10, 10, 20, 30);
for(int i=0; i<11; i++){
CUpDown* pupdown = new CUpDown;
rect.OffsetRect(0, 20);
pupdown->Create(NULL, WS_CHILD | WS_VISIBLE, rect, this, nID + i);
m_oaUpdowns.Add(pupdown);
}
d.在OnDestroy中,加上
for(int i=0; i<m_oaUpdowns.GetSize(); i++){
delete m_oaUpdowns[i];
}
e.在OnMouseDownUpdown1中,加上
CString str;
str.Format("%d", nID);
MessageBox(str);
用來指示是否收到事件
4.編譯一下,可以發現,絕對OK
下面,我們來看更多靈活的方法:
觀察MFC宏
BEGIN_EVENTSINK_MAP,END_EVENTSINK_MAP和ON_EVENT,可以發現MFC將控制項ID,事件ID和事件處理函數等等信息都放在AFX_EVENTSINKMAP_ENTRY這個結構,每個映射一個這種結構,所有的結構組成一數組放在AFX_EVENTSINKMAP結構中,本來以為動態修改這兩個結構信息,不就可以實現動態映射控制項事件了,可惜發現MFC定義了
const AFX_EVENTSINKMAP_ENTRY theClass::_eventsinkEntries[] =
{
...
}
可惡的const,只好另想它途了。
繼續觀察MFC源碼,發現它中間會有一個
BOOL CCmdTarget::OnEvent(UINT idCtrl, AFX_EVENT* pEvent,
AFX_CMDHANDLERINFO* pHandlerInfo)
{
...
}
函數中有如下代碼
VARIANT var;
AfxVariantInit(&var);
DISPPARAMS dispparams;
dispparams.rgvarg = NULL;
if (bRange)
{
memcpy(&dispparams, pEvent->m_pDispParams, sizeof(DISPPARAMS));
dispparams.rgvarg = new VARIANT[++dispparams.cArgs];
memcpy(dispparams.rgvarg, pEvent->m_pDispParams->rgvarg,
sizeof(VARIANT) * (dispparams.cArgs-1));
VARIANT* pvarID = &dispparams.rgvarg[dispparams.cArgs-1];
V_VT(pvarID) = VT_I4;
V_I4(pvarID) = idCtrl;
}
hResult = CallMemberFunc(&pEntry->dispEntry, DISPATCH_METHOD, &var,
(bRange ? &dispparams : pEvent->m_pDispParams), &uArgError);
ASSERT(FAILED(hResult) || (V_VT(&var) == VT_BOOL));
bHandled = V_BOOL(&var);
if (bRange)
delete [] dispparams.rgvarg;
break;
好了,切入口找到了,就用這個CallMemberFunc了,唯一的問題就是重新組織這個函數所需的參數了。
開始:
1.為避免干擾,乾脆注釋掉OnInitDialog上一例中添加的代碼,再加入如下代碼:
UINT nID = 10004;
CRect rect(10, 10, 20, 30);
for(int i=0; i<11; i++){
CUpDown* pupdown = new CUpDown;
rect.OffsetRect(0, 20);
pupdown->Create(NULL, WS_CHILD | WS_VISIBLE, rect, this, nID + i);
m_oaUpdowns.Add(pupdown);
}
其實就改了一個nID,之所以改nID,是為了表示這個ID是可以你自己動態確定的,當然這里省事,將這些ID連在了一起,其實分開也是沒問題的。
2.注釋掉事件映射
BEGIN_EVENTSINK_MAP(CTdaxDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CTdaxDlg)
//}}AFX_EVENTSINK_MAP
// ON_EVENT_RANGE(CTdaxDlg, IDC_UPDOWN1, IDC_UPDOWN1+10, -605 /* MouseDown */, OnMouseDownUpdown1, VTS_I4 VTS_I2 VTS_I2 VTS_I4 VTS_I4)
END_EVENTSINK_MAP()
3.重載對話框的OnCmdMsg,加入代碼如下:
if(nCode == CN_EVENT && nID >= 10004 && nID <= 10014){
AFX_EVENT* pEvent = (AFX_EVENT*)pExtra
4.編譯運行,OK了。
6. C++的activex(ocx)開發視頻播放插件實例源碼
在注冊表中找.但很麻煩.一般網上就有, 找到這樣的classid後記住就可以了,一般最重要的是兩個,一個是windows media player,還有一個是 說的realplayer.這兩個是最最主要的插件.記住這兩個就可以了.在注冊表中查找
【clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa】這個是realplayer的
注冊表的路徑是:hkey_classes_root\clsid\{cfcda953-8be4-11cf-b84b-0020afbbccfa}
【classid="clsid:05589fa1-c356-11ce-bf01-00aa0055595a"】這個是media player的
注冊表的路徑是hkey_classes_root\clsid\{05589fa1-c356-11ce-bf01-00aa0055595a}
當 在注冊表中找到路徑後,在後面就會顯示是什麼的classid了.