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

2022-11-22,,,,

   在平时的工作中,时常需要注册与反注册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++:制作一个控件注册的小工具的相关教程结束。

《VC++:制作一个控件注册的小工具.doc》

下载本文的Word格式文档,以方便收藏与打印。