VC++:制作一个控件注册的小工具

   在平时的工作中,时常需要注册与反注册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] = {0}; OPENFILENAME ofn = {0}; ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = m_hWnd; ofn.lpstrFilter = _T("ocx文件(*.ocx)*.ocxdll文件(*.dll)*.dll所有文件(*.*)*.*"); ofn.lpstrInitialDir = _T("D:\Program Files"); ofn.lpstrFile = szBuffer; ofn.nMaxFile = sizeof(szBuffer)/sizeof(*szBuffer); ofn.nFilterIndex = 0; 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...")) == 0) { 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...")) == 0) { 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...")) == 0) { MessageBox(_T("Please first select a ocx/dll file!")); return; } HKEY hKey = NULL; BOOL bIsRegisted = FALSE; TCHAR szPath[_MAX_PATH] = {0}; 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[0], guid.Data4[1] ,guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5] ,guid.Data4[6], guid.Data4[7] ); 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

  仅供学习交流、参考~

原文地址:https://www.cnblogs.com/MakeView660/p/6812908.html