【VS开发】动态创建ActiveX控件

VS开发 专栏收录该内容
275 篇文章 39 订阅 ¥39.90 ¥99.00

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控件的主工程节点中单击鼠标右键,在弹出的菜单中选择“添加---->类”菜单,在弹出的对话框中选择如下红色圈圈中的项:
动态创建ActiveX控件 - danshiming - danshiming的博客
单击“添加”按钮,弹出如下对话框
动态创建ActiveX控件 - danshiming - danshiming的博客
上面对话框罗列出了注册表中所有的ocx控件,找到你要添加的控件,单击“完成”,此时会生成一个封装该ocx的cpp和.h文件,在主程序中包含该.h即可使用该ocx控件中的接口了
  • 0
    点赞
  • 1
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 成长之路 设计师:Amelia_0503 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值