regsvr32的程序实现方法 注册控件一般都要regsvr32,如果我自己写一个安装程序,在执行过程中就完成了控件的注册,我不想用vc调用regsvr32加参数,并且屏蔽提示对话框的办法来注册,也就是说,我想自己写一个regsvr32的程序,请问是什么原理来着??谢谢,最好有返回值,告诉我注册的成功与否HRESULT 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 .dll类型的com组件都有DllRegisterServer()调用它就可以了,返回值好像是HRESULT。.EXE类型的好像是命令行参数 /register。 这个好像不行把,比如我要注册一个xxx.ocx的控件,具体代码怎么写,你说的那个函数好像不带参数啊 用Installshield做安装程序,里面有Self-registered这一项 msdn中有一个regsrv的例子。去看看吧 注册hLib = LoadLibrary(szDllName);fun = GetProcAddress(hLib, "DllRegisterServer");rc = fun();注销hLib = LoadLibrary(szDllName);fun = GetProcAddress(hLib, "DllUnregisterServer");rc = fun();自己判断hlib, fun和rc的值吧。 CString sPrompt;HINSTANCE hInst = ::LoadLibrary(sPath);if(hInst == NULL) { sPrompt.Format("Failed to find %s", sPath); ::MessageBox(m_hWnd, sPrompt, sTitle, MB_OK | MB_ICONEXCLAMATION); return;} FARPROC pFunc = ::GetProcAddress((HMODULE)hInst, "DllRegisterServer");if(pFunc == NULL) { sPrompt = "Failed to find \"DllRegisterServer\" function"; ::MessageBox(m_hWnd, sPrompt, sTitle, MB_OK | MB_ICONEXCLAMATION); return;} HRESULT hResult = (*pFunc)();if (SUCCEEDED(hResult)) { sPrompt = "Registered successfully."; ::MessageBox(m_hWnd, sPrompt, sTitle, MB_OK | MB_ICONINFORMATION);}else { sPrompt = "Failed to register."; ::MessageBox(m_hWnd, sPrompt, sTitle, MB_OK | MB_ICONEXCLAMATION);} MSDN例子:先使用 LoadLibrary Windows API 加载控件 DLL。下一步,使用 GetProcAddress 获得“DllRegisterServer”函数的地址。最后,调用 DllRegisterServer 函数。下列代码示例说明一个可能的方法,在此方法中,hLib 存储控件库的句柄,而 lpDllEntryPoint 存储“DllRegisterServer”函数的地址。HINSTANCE hLib = LoadLibrary(pszDllName);if (hLib < (HINSTANCE)HINSTANCE_ERROR){ DisplayMessage(IDS_LOADLIBFAILED, pszDllName); //unable to load DLL iReturn = FAIL_LOAD; //unable to load DLL}// Find the entry point.(FARPROC&)lpDllEntryPoint = GetProcAddress(hLib, _T("DllRegisterServer"));if (lpDllEntryPoint != NULL) (*lpDllEntryPoint)();else // Unable to locate entry point直接注册控件的优点是不需要调用和加载单独的进程(即 REGSVR32),从而减少了安装时间。另外,由于注册是个内部进程,因此安装程序对错误和无法预料情况的处理会比外部进程要好。注意 安装程序在安装 ActiveX 控件前,应调用 OleInitialize。安装程序完成后,调用 OleUnitialize。这确保 OLE 系统 DLL 在正确的状态中注册 ActiveX 控件。 调用COM事件 CTreeCtrl移动item项 不想要cwnd了,如何摧毁?destroywindow? [急!!]有SOHO一族指导一下,现在做应用程序是怎样收费的?? 如何在打开BMP位图时进行窗口刷新 接受到一16进制的字节,再用10进制显示出来的问题?100分求助..... EDIT 怎样输入小数?怎样以回车来表示输入结束来进行下一个输入? matlab的一个错误报告在VC中的情况,怎样解决 网络编程高手请进! puppet(小虎) 在不在? 用VC实现POP3接收mail及其附件的例子,那位朋友有?急需 请教——在对话框应用程序中如何屏蔽回车键?
hLib = LoadLibrary(szDllName);
fun = GetProcAddress(hLib, "DllRegisterServer");
rc = fun();
注销
hLib = LoadLibrary(szDllName);
fun = GetProcAddress(hLib, "DllUnregisterServer");
rc = fun();自己判断hlib, fun和rc的值吧。
HINSTANCE hInst = ::LoadLibrary(sPath);
if(hInst == NULL) {
sPrompt.Format("Failed to find %s", sPath);
::MessageBox(m_hWnd, sPrompt, sTitle, MB_OK | MB_ICONEXCLAMATION);
return;
}
FARPROC pFunc = ::GetProcAddress((HMODULE)hInst, "DllRegisterServer");
if(pFunc == NULL) {
sPrompt = "Failed to find \"DllRegisterServer\" function";
::MessageBox(m_hWnd, sPrompt, sTitle, MB_OK | MB_ICONEXCLAMATION);
return;
}
HRESULT hResult = (*pFunc)();
if (SUCCEEDED(hResult)) {
sPrompt = "Registered successfully.";
::MessageBox(m_hWnd, sPrompt, sTitle, MB_OK | MB_ICONINFORMATION);
}
else {
sPrompt = "Failed to register.";
::MessageBox(m_hWnd, sPrompt, sTitle, MB_OK | MB_ICONEXCLAMATION);
}
{
DisplayMessage(IDS_LOADLIBFAILED, pszDllName); //unable to load DLL
iReturn = FAIL_LOAD; //unable to load DLL
}// Find the entry point.
(FARPROC&)lpDllEntryPoint = GetProcAddress(hLib,
_T("DllRegisterServer"));
if (lpDllEntryPoint != NULL)
(*lpDllEntryPoint)();
else
// Unable to locate entry point
直接注册控件的优点是不需要调用和加载单独的进程(即 REGSVR32),从而减少了安装时间。另外,由于注册是个内部进程,因此安装程序对错误和无法预料情况的处理会比外部进程要好。注意 安装程序在安装 ActiveX 控件前,应调用 OleInitialize。安装程序完成后,调用 OleUnitialize。这确保 OLE 系统 DLL 在正确的状态中注册 ActiveX 控件。