在平时的工作中,时常需要注册与反注册ActiveX控件,有时需要判断控件是否已经注册。

     所以通过查找资料编写了一个控件注册的小工具,欢迎学习交流,不当之处请多多交流。

   先直接上图:

   

     主要代码:

 //ControlRegisterDlg.h

  CEdit m_EditOcxPath;
  CString m_strOcxPath;

  afx_msg void OnBtnSelect();
  afx_msg void OnBtnRegister();
  afx_msg void OnBtnUnregister();
  afx_msg void OnBtnIsregisted();

  

 //ControlRegisterDlg.cpp

  ON_BN_CLICKED(IDC_BTN_SELECT, OnBtnSelect)
  ON_BN_CLICKED(IDC_BTN_REGISTER, OnBtnRegister)
  ON_BN_CLICKED(IDC_BTN_UNREGISTER, OnBtnUnregister)
  ON_BN_CLICKED(IDC_BTN_ISREGISTED, OnBtnIsregisted)


void CControlRegisterDlg::OnBtnSelect()
{
TCHAR szBuffer[MAX_PATH] = {};
OPENFILENAME ofn = {};
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = m_hWnd;
ofn.lpstrFilter = _T("ocx文件(*.ocx)\0*.ocx\0dll文件(*.dll)\0*.dll\0所有文件(*.*)\0*.*\0");
ofn.lpstrInitialDir = _T("D:\\Program Files");
ofn.lpstrFile = szBuffer;
ofn.nMaxFile = sizeof(szBuffer)/sizeof(*szBuffer);
ofn.nFilterIndex = ;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER ;
BOOL bSel = GetOpenFileName(&ofn);
if (bSel)
{
m_EditOcxPath.SetWindowText(szBuffer);
m_strOcxPath = szBuffer;
}
} void CControlRegisterDlg::OnBtnRegister()
{
if (m_strOcxPath.IsEmpty() || m_strOcxPath.CompareNoCase(_T("Please select a ocx/dll control...")) == )
{
MessageBox(_T("Please first select a ocx/dll file!"));
return;
} HINSTANCE hLib = LoadLibrary(m_strOcxPath); if (hLib == NULL)
{
MessageBox(_T("Fail to load ocx/dll file!"));
return;
} FARPROC lpDllEntryPoint;
lpDllEntryPoint = GetProcAddress(hLib,"DllRegisterServer"); if(lpDllEntryPoint != NULL)
{
if(FAILED((*lpDllEntryPoint)()))
{
MessageBox(_T("Fail to regist ocx/dll file!"));
FreeLibrary(hLib);
return;
};
MessageBox(_T("Bingo! Succed to regist ocx/dll file!"));
}
else
{
MessageBox(_T("Fail to get DllRegisterServer!"));
}
} void CControlRegisterDlg::OnBtnUnregister()
{
if (m_strOcxPath.IsEmpty() || m_strOcxPath.CompareNoCase(_T("Please select a ocx/dll control...")) == )
{
MessageBox(_T("Please first select a ocx/dll file!"));
return;
} HINSTANCE hLib = LoadLibrary(m_strOcxPath);
if (hLib==NULL)
{
MessageBox(_T("Fail to load ocx/dll file!"));
return;
} FARPROC lpDllEntryPoint;
lpDllEntryPoint = GetProcAddress(hLib,"DllUnregisterServer"); if(lpDllEntryPoint != NULL)
{
if(((*lpDllEntryPoint)()))
{
MessageBox(_T("Fail to get DllUnRegisterServer!!!"));
FreeLibrary(hLib);
return;
};
MessageBox(_T("Bingo! Succed to unregist ocx/dll file!"));
}
else
{
MessageBox(_T("Fail to get DllUnRegisterServer!!!"));
} } void CControlRegisterDlg::OnBtnIsregisted()
{
if (m_strOcxPath.IsEmpty() || m_strOcxPath.CompareNoCase(_T("Please select a ocx/dll control...")) == )
{
MessageBox(_T("Please first select a ocx/dll file!"));
return;
} HKEY hKey = NULL;
BOOL bIsRegisted = FALSE;
TCHAR szPath[_MAX_PATH] = {};
DWORD dwRegType;
DWORD cbData = sizeof(szPath) * sizeof(TCHAR); USES_CONVERSION;
ITypeLib* pTypeLib;
if(SUCCEEDED(LoadTypeLib(T2OLE(m_strOcxPath), &pTypeLib)))
{
TLIBATTR* tlibAttr;
pTypeLib->GetLibAttr(&tlibAttr);
//tlibAttr.guid就是要的CLSID
GUID guid = tlibAttr->guid;
CString strGuid;
strGuid.Format( _T("{%08X-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X}")
,guid.Data1
,guid.Data2
,guid.Data3
,guid.Data4[], guid.Data4[]
,guid.Data4[], guid.Data4[], guid.Data4[], guid.Data4[]
,guid.Data4[], guid.Data4[] );
CString strClsIdFormat(_T("CLSID\\%s\\InprocServer32"));
CString strClsId;
strClsId.Format(strClsIdFormat, strGuid);
::RegOpenKey(HKEY_CLASSES_ROOT, strClsId, &hKey); if(hKey)
{
bIsRegisted = TRUE;
MessageBox(_T("Ocx/Dll State: Registed!"));
}
else
{
bIsRegisted = FALSE;
MessageBox(_T("Ocx/Dll State: UnRegisted!"));
} pTypeLib->Release();
}
}

  代码下载: http://pan.baidu.com/s/1kV3aARP 密码:a9zs

  仅供学习交流、参考~

VC++:制作一个控件注册的小工具的更多相关文章

  1. CAD向控件注册一个命令

    _DMxDrawX::RegistUserCustomCommand 向控件注册一个命令,用户在命令行输入命令名这个字符串,就会触发执行命令事件 命令事件的id就是该注册时的id值,成功返回true. ...

  2. CAD向控件注册一个命令(com接口VB语言)

    主要用到函数说明: MxDrawXCustomFunction::Mx_RegistUserCustomCommand 向控件注册一个命令,用户在命令行输入命令名这个字符串,就会触发执行命令事件 命令 ...

  3. C#制作ActiveX控件及部署升级(摘自网络)

    使用C#开发ActiveX控件 控件开发.制作CAB包.签名.部署 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序 ...

  4. VC++编写ActiveX控件

    ActiveX这门技术是通过生成“*.ocx”文件来实现的.先来了解下OCX文件,在百度百科上面对OCX是这样解释的:“.ocx是ocx控件的扩展名,OCX 是对象类别扩充组件.如果你用过Visual ...

  5. C#-WebForm-WebForm开发基础、如何给控件注册事件?——事件委托写法、http无状态性、三层结构

    (小知识 - xml:可扩展的标记语言 html:超文本标记语言) 一.创建WebForm:新建→网站 此时文件夹中只有一个 config 文件,打开后 二.在项目下右键添加新项 在设计页面中打开 从 ...

  6. VFP中OCX控件注册检测及自动注册

    这是原来从网上搜集.整理后编制用于自己的小程序使用的OCX是否注册及未注册控件的自动注册函数. CheckCtrlFileRegist("ctToolBar.ctToolBarCtrl.4& ...

  7. 第二十一篇:SOUI中的控件注册机制

    Win32编程中,用户需要一个新控件时,需要向系统注册一个新的控件类型.注册以后,调用::CreateWindow时才能根据标识控件类型的字符串创建出一个新的控件窗口对象. 为了能够从XML描述的字符 ...

  8. WPF--Blend制作Button控件模板

    博客园新人,WPF初学者.不涉及理论知识,直接进入操作. 记录一下使用Blend制作Button控件模板过程中,学到Blend几个知识点: 1.渐变画笔编辑器的Alpha选项可以调控件的透明度.即下图 ...

  9. 控件注册 - 利用资源文件将dll、ocx打包进exe文件(C#版)

    原文:控件注册 - 利用资源文件将dll.ocx打包进exe文件(C#版) 很多时候自定义或者引用控件都需要注册才能使用,但是如何使要注册的dll或ocx打包到exe中,使用户下载以后看到的只是一个e ...

随机推荐

  1. Mock制作假数据

    name 为属性名, rule 为规则, value 为值,属性名和生成规则之间用|分隔,生成规则的格式有7种: 字符串 String, 数字 Number, 布尔型 Boolean, 对象 Obje ...

  2. MySQL修改root密码的多种方法(转)

    http://jingyan.baidu.com/article/0320e2c198ad5f1b87507bc8.html ********************************* 方法1 ...

  3. sqlserver判断是否为数字的函数

    ISNUMERIC 确定表达式是否为一个有效的数字类型. 语法  ISNUMERIC ( expression ) 参数 expression 要计算的表达式. 返回类型 int 测试: select ...

  4. java 多线程4: java线程的优先级

    Java线程的优先级取值范围是1 (Thread.MIN_PRIORITY ) 到 10 (Thread.MAX_PRIORITY ).如果没有设置, 线程默认的优先级是NORM_PRIORITY.这 ...

  5. show global status和show variables mysql 优化

    mysql> show global status; 可以列出MySQL服务器运行各种状态值,我个人较喜欢的用法是show status like '查询值%'; 一.慢查询 mysql> ...

  6. 被linux线程基础折磨的点滴——还是没得到完美的答案,但至少得到了所需

    #include<sys/types.h> #include<unistd.h> #include<stdio.h> #include<stdlib.h> ...

  7. sql插入数据

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. css3实现的鼠标经过按钮特效

    今天要为各网友再带来一款css实现的鼠标经过按钮的特效.按钮初始时,边框为断开的按钮,当鼠标经过按钮时动画变为封闭的边框.效果图如下: 在线预览   源码下载 我们一起看下实现的代码: html代码: ...

  9. pthread_self()究竟根据什么来得到线程的标识符????

    #include<stdlib.h> #include<pthread.h> #include<stdio.h> #include<sched.h> # ...

  10. 指针的引用(*&)与指针的指针(**)

    指针的引用(*&)与指针的指针(**) 在下列函数声明中,为什么要同时使用*和&符号?以及什么场合使用这种声明方式? void func1( MYCLASS *&pBuildi ...