描述:
我做了个web控件,在频繁的更新测试,有时后会发生怎么也
御载不了原来大的版本的控件,最后只好载注册表查找控件
的clsid,然后把注册表中的这些项删掉,然后浏览web页面的
时候就会重装控件,并且正常。。。。。
怎么编写控件的反安装程序啊,不用手动的去清楚注册表。。
解决方案1:
HINSTANCE hIn = Loadlibrary("path and ocx file name");
if(NULL == hIn)
return;
FARPROC proc;
proc = GetProcAddress(hIn,"DLLURegisterServer");
if(NULL!=proc)
{
if(FAILED((*proc)()))
return
else
MessageBox("uregister success!");
}
else
return;
这个是VC里的反注册
如果嫌麻烦,就可以直接在“.bat”文件里面写一句“unregsrv /u 路径+控件名”,运行即可,或者在运行
里写上面的语句也一样可行。
可以用shellexecute 执行regsvr32 /u
也可以用注册表函数删除
typedef DWORD(CALLBACK * PREG)(void);
void CRegOCXDlg::OnReg()
{
// TODO: Add your control notification handler code here
TCHAR AppFullPath[_MAX_PATH];
GetModuleFileName(NULL,AppFullPath,_MAX_PATH);
CString m_AppPath;
m_AppPath=AppFullPath;
int iAppPosition;
iAppPosition=m_AppPath.ReverseFind('\\');
m_AppPath=m_AppPath.Mid(0,iAppPosition+1);
char pOCXPath[100];
PREG lpDllEntryPoint;
HINSTANCE hLib;
CString m_OCXFileName;
if(m_OcxList.GetCurSel()==CB_ERR)
{
m_OCXFileName="NULL";
(CButton*)GetDlgItem(IDC_REG)->EnableWindow(FALSE);
}
else
{
m_OcxList.GetLBText(m_OcxList.GetCurSel(),m_OCXFileName);
(CButton*)GetDlgItem(IDC_REG)->EnableWindow(TRUE);
}
if(m_OCXFileName=="NULL")
{
(CButton*)GetDlgItem(IDC_REG)->EnableWindow(FALSE);
}
else
{
sprintf(pOCXPath,"%s%s",m_AppPath,m_OCXFileName);
hLib=LoadLibrary(pOCXPath);
if(hLib)
{
//注意这里,将函数地址DllRegisterServer改为DllUnregisterServer就可以了
lpDllEntryPoint=(PREG)GetProcAddress(hLib,_T("DllRegisterServer"));
if(lpDllEntryPoint!=NULL)
{
(*lpDllEntryPoint)();
AfxMessageBox("组件注册初始成功!",MB_ICONINFORMATION);
FreeLibrary(hLib);
}
else
{
AfxMessageBox("组件注册初始失败!",MB_ICONINFORMATION);
}
}
}
}
到http://www.installsite.org/看看是否有相关的例子!