activex控件注册问题 我用VC++开发了一个OCX控件,在有的机子上能注册成功,有的机子不行,请问大侠如何解决这个问题,其它机子也装了VC的有时也会出现这个问题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 该ocx空间是否包含了其他组建将它包含的组建的dll拷贝过去 maybe your ocx has used other modules,but some machines have not. 控件 何志丹1,File=>New=>Project=>MFC ActiveX ControlWizard创建一个名为Owner的工程,所有的设置都默认,直接Finish就可以了。4,Ctrl+F5运行。Executable For Debug Session,选取消就可以了。5,Tool=>ActiveX Control Test Container中进行测试。6,注册,将控件的ocx文件拷到Windows系统目录下,如:win95\system.开始菜单,运行Regsvr32 Owner.ocx. Regsvr32 [/u][/s][/c][/i[:cmdline]] dllname 其中: /u 注销动态库 /s 不显示提示信息 /c 输出控制台 /i 调用Dllinstall并传递cmdline,与/u一起使用时调用注销程序 /n 不调用DllRegisterSever,必须与/i一起使用。7,创建一个基于对话框的可执行程序OwnerExe,注意AppWizard-Step 2 of 6将ActiveX controls复选框选中。 应用程序向导会为我们添加BOOL COwnerExeApp::InitInstance(){ AfxEnableControlContainer(); ......8,Project=>Add To Project- Components.找到刚才注册的控件,插入到控制工具栏中。像使用标准控件一样将它弄到对话框上。9,Ctrl+F5,我们就可以看到一个什么都不干的控件。下面我们来做一个检查一个数是不是2的几次幂(如1,2,4,8)的控件,我们来补充第二步和第三步。2,在COwnerCtrl增加一个布尔变量Is2n,初值为false;将OnDraw改成:void COwnerCtrl::OnDraw( CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid){ CBrush * pBrush; if(Is2n) pBrush = new CBrush(RGB(255,0,0)); else pBrush = new CBrush(RGB(255,255,255)); pdc->FillRect(rcBounds, pBrush); delete pBrush;}Ctrl+w打开类向导,Automation=>Add Method. name填IsPow2n,返回值void,一个长整形的参数x.注意有多个参数时,用向下光标键或PageDown移动。修改此函数:void COwnerCtrl::IsPow2n(long x) { Is2n = ((x&-x)==x); InvalidateControl();}Ctrl+F5生成新的ocx,覆盖原来的ocx.注意当Windows系统目录下的ocx被修改以后,我们的程序中的oxc会自动更新控件。并不是控件所有的函数都可以被控件使用者调用,只有方法才可以。回到OwnerExe,加一个编辑控件(与一个长整形变量m_input相关联)和一个按钮,让控件与m_ctrl相关联,此按钮的响应函数为:void COwnerExeDlg::OnIs2n() { UpdateData(); m_ctrl.IsPow2n(m_input);}Ctrl+F5,查看效果,仔细一点就会发现当输入零时,结果是错的。显然0不可能是2的n次方。3,我们为控件定义一个事件,事件很像自定义的消息,你必须决定它何时被调用,并用在调用时,必须设置好初值。再回到我们的控件,ctrl+w=>ActiveX Events=>Add Events.名字Zero,参数为x,长整形。将if(0 == x)FireZero(x);插到void COwnerCtrl::IsPow2n(long x)中,表示在IsPow2n执行过程过发现IsPow2n的参数为0,此方法被调用。且它的参数与IsPow2n相同。void COwnerCtrl::IsPow2n(long x) { Is2n = ((x&-x)==x); if(0 == x) { FireZero(x); Is2n = false; } InvalidateControl();}回到OwnerExe,Ctrl+w=>MessageMaps. ID填我们的控件,在Messages中双击我们刚刚加的Zero,编辑函数:void COwnerExeDlg::OnZeroOwnerctrl1(long x) { CString str; str.Format("请输入一个非%ld整数",x); AfxMessageBox(str);}Ctrl+F5。3.5大家可能觉得颜色设置得太差,我们可以增加控件的属性。回到我们的控件,Ctrl+w=>Automation=>Add Property;在External name中选择库存属性。我们来自定义两个属性是2的n次方时的颜色和不是时的颜色,isColor,notColor;类型是OLE_COLOR;编辑代码。void COwnerCtrl::OnIsColorChanged() { InvalidateControl(); SetModifiedFlag();}void COwnerCtrl::OnNotColorChanged() { InvalidateControl(); SetModifiedFlag();}void COwnerCtrl::OnDraw( CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid){ CBrush * pBrush; if(Is2n) pBrush = new CBrush(m_isColor); else pBrush = new CBrush(m_notColor); pdc->FillRect(rcBounds, pBrush); delete pBrush;}void COwnerCtrl::DoPropExchange(CPropExchange* pPX){ ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor)); COleControl::DoPropExchange(pPX); PX_Color(pPX,"isColor",m_isColor,RGB(0,255,255)); PX_Color(pPX,"notColor",m_notColor,RGB(0,255,0));}后两行不只是赋初值,同时还使得控件使用者可以用颜色对话框选择颜色。 CStatic 控件属性 对象成员要对所属类的数据成员进行操作,怎么办? 指针在构造函数与OnInitDialog函数区别 VC 打印发票时向打印机发命令,退纸 进纸 可停止进纸 简简单单,好比有个按钮,想向左移动20个象素怎么做? 高分求 C++ Primer 电子书下载 求求你们了 《vc++技术内幕》中的一句话不明白,高手进来看看 关于mime 关于dll在代理中的运行问题?(H) 如何在运行时确定对话框的大小呢。我已经问的没有分了,还没人回答,惨 如何去掉滚动条?
该ocx空间是否包含了其他组建将它包含的组建的dll拷贝过去
1,File=>New=>Project=>MFC ActiveX ControlWizard创建一个名为Owner的工程,所有的设置都默认,直接Finish就可以了。
4,Ctrl+F5运行。Executable For Debug Session,选取消就可以了。
5,Tool=>ActiveX Control Test Container中进行测试。
6,注册,将控件的ocx文件拷到Windows系统目录下,如:win95\system.开始菜单,运行Regsvr32 Owner.ocx.
Regsvr32 [/u][/s][/c][/i[:cmdline]] dllname
其中:
/u 注销动态库
/s 不显示提示信息
/c 输出控制台
/i 调用Dllinstall并传递cmdline,与/u一起使用时调用注销程序
/n 不调用DllRegisterSever,必须与/i一起使用。
7,创建一个基于对话框的可执行程序OwnerExe,注意AppWizard-Step 2 of 6将ActiveX controls复选框选中。
应用程序向导会为我们添加
BOOL COwnerExeApp::InitInstance()
{
AfxEnableControlContainer();
......
8,Project=>Add To Project- Components.找到刚才注册的控件,插入到控制工具栏中。像使用标准控件一样将它弄到对话框上。
9,Ctrl+F5,我们就可以看到一个什么都不干的控件。
下面我们来做一个检查一个数是不是2的几次幂(如1,2,4,8)的控件,我们来补充第二步和第三步。
2,在COwnerCtrl增加一个布尔变量Is2n,初值为false;将OnDraw改成:
void COwnerCtrl::OnDraw(
CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
CBrush * pBrush;
if(Is2n)
pBrush = new CBrush(RGB(255,0,0));
else
pBrush = new CBrush(RGB(255,255,255));
pdc->FillRect(rcBounds, pBrush);
delete pBrush;
}
Ctrl+w打开类向导,Automation=>Add Method. name填IsPow2n,返回值void,一个长整形的参数x.注意有多个参数时,用向下光标键或PageDown移动。
修改此函数:void COwnerCtrl::IsPow2n(long x)
{
Is2n = ((x&-x)==x);
InvalidateControl();
}
Ctrl+F5生成新的ocx,覆盖原来的ocx.注意当Windows系统目录下的ocx被修改以后,我们的程序中的oxc会自动更新控件。并不是控件所有的函
数都可以被控件使用者调用,只有方法才可以。
回到OwnerExe,加一个编辑控件(与一个长整形变量m_input相关联)和一个按钮,让控件与m_ctrl相关联,此按钮的响应函数为:
void COwnerExeDlg::OnIs2n()
{
UpdateData();
m_ctrl.IsPow2n(m_input);
}
Ctrl+F5,查看效果,仔细一点就会发现当输入零时,结果是错的。显然0不可能是2的n次方。
3,我们为控件定义一个事件,事件很像自定义的消息,你必须决定它何时被调用,并用在调用时,必须设置好初值。
再回到我们的控件,ctrl+w=>ActiveX Events=>Add Events.名字Zero,参数为x,长整形。
将if(0 == x)FireZero(x);插到void COwnerCtrl::IsPow2n(long x)中,表示在IsPow2n执行过程过发现IsPow2n的参数为0,此方法被调用。且它的参数与IsPow2n相同。
void COwnerCtrl::IsPow2n(long x)
{
Is2n = ((x&-x)==x);
if(0 == x)
{
FireZero(x);
Is2n = false;
}
InvalidateControl();
}回到OwnerExe,Ctrl+w=>MessageMaps. ID填我们的控件,在Messages中双击我们刚刚加的Zero,编辑函数:
void COwnerExeDlg::OnZeroOwnerctrl1(long x)
{
CString str;
str.Format("请输入一个非%ld整数",x);
AfxMessageBox(str);
}
Ctrl+F5。
3.5大家可能觉得颜色设置得太差,我们可以增加控件的属性。
回到我们的控件,Ctrl+w=>Automation=>Add Property;在External name中选择库存属性。
我们来自定义两个属性是2的n次方时的颜色和不是时的颜色,isColor,notColor;类型是OLE_COLOR;编辑代码。
void COwnerCtrl::OnIsColorChanged()
{
InvalidateControl();
SetModifiedFlag();
}void COwnerCtrl::OnNotColorChanged()
{
InvalidateControl();
SetModifiedFlag();
}
void COwnerCtrl::OnDraw(
CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
CBrush * pBrush;
if(Is2n)
pBrush = new CBrush(m_isColor);
else
pBrush = new CBrush(m_notColor);
pdc->FillRect(rcBounds, pBrush);
delete pBrush;
}
void COwnerCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
PX_Color(pPX,"isColor",m_isColor,RGB(0,255,255));
PX_Color(pPX,"notColor",m_notColor,RGB(0,255,0));
}
后两行不只是赋初值,同时还使得控件使用者可以用颜色对话框选择颜色。