整理: 向自己的控件注册程序传递命令行参数来注册控件

起因: 今天的一个工程里,控件安装后注册不上, 不是我把自注册组件的选项选错了,我可以肯定这一点.

临时的解决方法: 在InstallShield脚本中调用<windir>/system32/regsvr32.exe 来注册控件, 这样注册成功后,总有确定对话框要点击.

这不能作为最后的安装版本.

 

解决了总要点击对话框的问题. 加 /s 选项, 可以静默的注册. 这样修改InstallShield脚本,最为简单.

Windows中都有regsvr32.exe, 如果自己写注册控件的程序, 用CreateProcess来调用regsvr32.exe, 这种方法最简单, 够用了.

regsvr32 /s /u _TestOcx.ocx regsvr32 /s /i _TestOcx.ocx pause 

用Win32Api完成了传递命令行参数注册控件的exe, 代码很简洁.

 

BOOL CMainDoc::OnOpenDocument(LPCTSTR lpszPathName) { if (!CDocument::OnOpenDocument(lpszPathName)) return FALSE; // TODO: Add your specialized creation code here //我们生成的测试控件在控件包容器中的名字是: Ctrl_TestOcx Control TRACE("lpszPathName = %s/n", lpszPathName); FARPROC pProc = NULL; int nRc = 0; CMainApp * pApp = (CMainApp *)AfxGetApp(); HINSTANCE hInstance = LoadLibrary(lpszPathName); pApp->SetRegisterResult(hInstance ? S_OK : S_FALSE); if(hInstance) { pProc = GetProcAddress(hInstance, "DllUnregisterServer"); if(!pProc) { pApp->SetRegisterResult(S_FALSE); } else { /** * @note * 即使没有注册过这个控件, 反注册也是成功的 * 用来先卸载同名旧版控件 */ nRc = pProc(); pApp->SetRegisterResult((NOERROR == nRc) ? S_OK : S_FALSE); } if(S_OK == pApp->GetRegisterResult()) { pProc = GetProcAddress(hInstance, "DllRegisterServer"); if(!pProc) { pApp->SetRegisterResult(S_FALSE); } else { /** * @note * 注册新版控件 * 只要是正确的Dll或Ocx, 而且环境中包含附属的其他Dll, 注册一定会成功 */ nRc = pProc(); pApp->SetRegisterResult((NOERROR == nRc) ? S_OK : S_FALSE); } } FreeLibrary(hInstance); } return TRUE; }

int CMainApp::ExitInstance() { // TODO: Add your specialized code here and/or call the base class int nRc = CWinApp::ExitInstance(); /** * @note * 根据控件注册结果返回 S_OK, S_FALSE, ... */ return GetRegisterResult(); }

其他工作是:

1. 程序启动后不显示UI.

2. 处理完命令行后,自动退出程序.

 

不管是InstallShield还是用CreateProcess, 可以通过程序结束时的返回码(S_OK, S_FALSE), 来判断控件是否注册成功.

 

工程下载点:

整理: 向自己的控件注册程序传递命令行参数来注册控件_第1张图片

 

在实际工程中应用, 好使. 证明控件都注册上了, 没有报错提示.

#define REGSVR32_EXE WINSYSDIR^"regsvr32.exe" export prototype RegisterControl(); function RegisterControl() STRING strProg; STRING strCmd1; begin //手动注册Test.ocx SdShowMsg("正在注册Test.ocx...",TRUE); strProg = REGSVR32_EXE; strCmd1 = "/"-s " + TARGETDIR^"bin//Test.ocx" + "/""; if(LaunchApplication (strProg, strCmd1, "", SW_HIDE, INFINITE, LAAW_OPTION_WAIT)<0)then MessageBox("Test.ocx 控件注册失败!", SEVERE); abort; endif; SdShowMsg("正在注册Test.ocx...",FALSE); end;

你可能感兴趣的:(整理: 向自己的控件注册程序传递命令行参数来注册控件)