【VS开发】动态创建ActiveX控件
2016-07-23 12:52
495 查看
bool CCollectDataDlgDlg::CreateMyCtrl(LPRECT lpRect, UINT nID, CWnd *pParent)
{
CLSID clsid;
wstring strClsid = _T("{126983A5-3415-4A3F-B2C6-D18DDF6E43B9}"); // 控件id号
CCOMHelper COMHelper;
COMHelper.clsid_from_string(&clsid, strClsid.c_str());
BOOL bSucc = false;
TCHAR szMsg[1024] = {0};
try
{
// MyCtrl必须是全局的CWnd类对象
bSucc = m_MyCtrl.CreateControl(
clsid,
_T("CollectData"),
WS_CHILD | WS_VISIBLE| WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
CRect(lpRect),
pParent,
nID,
NULL, FALSE, NULL);
}
catch (CMemoryException* e)
{
e->GetErrorMessage(szMsg, 1024);
e->Delete();
}
catch (CFileException* e)
{
e->GetErrorMessage(szMsg, 1024);
e->Delete();
}
catch (CException* e)
{
e->GetErrorMessage(szMsg, 1024);
e->Delete();
}
if (!bSucc)
{
AfxMessageBox(_T("创建CollectData.ocx控件失败\r\n请检查CollectData.ocx控件是否安装并注册"));
return false;
}
IUnknown *pUnk = m_MyCtrl.GetControlUnknown();
CComQIPtr<_DCollectData> spDCollectDataCtl(pUnk);
if (spDCollectDataCtl == NULL)
{
AfxMessageBox(_T("无法从CollectData.ocx中获取_DCollectData接口"));
return false;
}
return true;
}
注意:必须在工程的app文件的InitInstance()中加入如下代码,否则动态创建控件不会成功
AfxEnableControlContainer();
上述只是动态创建了ocx控件,但控件的接口函数等还是不能用,必须按下面的步骤,控件的接口等才会被识别:
在你加载该ocx控件的主工程节点中单击鼠标右键,在弹出的菜单中选择“添加---->类”菜单,在弹出的对话框中选择如下红色圈圈中的项:
单击“添加”按钮,弹出如下对话框
上面对话框罗列出了注册表中所有的ocx控件,找到你要添加的控件,单击“完成”,此时会生成一个封装该ocx的cpp和.h文件,在主程序中包含该.h即可使用该ocx控件中的接口了
{
CLSID clsid;
wstring strClsid = _T("{126983A5-3415-4A3F-B2C6-D18DDF6E43B9}"); // 控件id号
CCOMHelper COMHelper;
COMHelper.clsid_from_string(&clsid, strClsid.c_str());
BOOL bSucc = false;
TCHAR szMsg[1024] = {0};
try
{
// MyCtrl必须是全局的CWnd类对象
bSucc = m_MyCtrl.CreateControl(
clsid,
_T("CollectData"),
WS_CHILD | WS_VISIBLE| WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
CRect(lpRect),
pParent,
nID,
NULL, FALSE, NULL);
}
catch (CMemoryException* e)
{
e->GetErrorMessage(szMsg, 1024);
e->Delete();
}
catch (CFileException* e)
{
e->GetErrorMessage(szMsg, 1024);
e->Delete();
}
catch (CException* e)
{
e->GetErrorMessage(szMsg, 1024);
e->Delete();
}
if (!bSucc)
{
AfxMessageBox(_T("创建CollectData.ocx控件失败\r\n请检查CollectData.ocx控件是否安装并注册"));
return false;
}
IUnknown *pUnk = m_MyCtrl.GetControlUnknown();
CComQIPtr<_DCollectData> spDCollectDataCtl(pUnk);
if (spDCollectDataCtl == NULL)
{
AfxMessageBox(_T("无法从CollectData.ocx中获取_DCollectData接口"));
return false;
}
return true;
}
注意:必须在工程的app文件的InitInstance()中加入如下代码,否则动态创建控件不会成功
AfxEnableControlContainer();
上述只是动态创建了ocx控件,但控件的接口函数等还是不能用,必须按下面的步骤,控件的接口等才会被识别:
在你加载该ocx控件的主工程节点中单击鼠标右键,在弹出的菜单中选择“添加---->类”菜单,在弹出的对话框中选择如下红色圈圈中的项:
单击“添加”按钮,弹出如下对话框
上面对话框罗列出了注册表中所有的ocx控件,找到你要添加的控件,单击“完成”,此时会生成一个封装该ocx的cpp和.h文件,在主程序中包含该.h即可使用该ocx控件中的接口了
相关文章推荐
- Yii CModel中rules验证规则
- Android之AsyncTask异步加载(三)
- Spring之AOP面向切面编程实现(一)
- POJ 1915 BFS题目
- 软件升级包封装方法以及软件升级方法
- Android全部源码导入Eclipse
- 微信错误:errcode=45015, errmsg=response out of time limit or subscription is canceled
- MySQL隔离级别
- cf701B Cells Not Under Attack
- 项目正在用 非常实用的 maven的构件实现
- 虚幻4属性系统(反射)翻译
- 过滤器的使用:下载计数过滤器
- Spark简要学习
- soft raid5阅读笔记之九--MD中的superblock
- SQL Server自增长列插入指定值 -- SET IDENTITY_INSERT ON|OFF(转)
- cf701A Cards
- 矩阵范数求导规则
- 【NOIP2012】 Vigenère密码
- 二叉树后序遍历递归+非递归
- JDBC之调用存储过程