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了.