注册控件一般都要regsvr32,如果我自己写一个安装程序,在执行过程中就完成了控件的注册,我不想用vc调用regsvr32加参数,并且屏蔽提示对话框的办法来注册,也就是说,我想自己写一个regsvr32的程序,请问是什么原理来着??谢谢,最好有返回值,告诉我注册的成功与否HRESULT

解决方案 »

  1.   

    .dll类型的com组件都有DllRegisterServer()调用它就可以了,返回值好像是HRESULT。.EXE类型的好像是命令行参数 /register。
      

  2.   

    这个好像不行把,比如我要注册一个xxx.ocx的控件,具体代码怎么写,你说的那个函数好像不带参数啊
      

  3.   

    用Installshield做安装程序,里面有Self-registered这一项
      

  4.   

    msdn中有一个regsrv的例子。去看看吧
      

  5.   

    注册
    hLib = LoadLibrary(szDllName);
    fun = GetProcAddress(hLib, "DllRegisterServer");
    rc = fun();
    注销
    hLib = LoadLibrary(szDllName);
    fun = GetProcAddress(hLib, "DllUnregisterServer");
    rc = fun();自己判断hlib, fun和rc的值吧。
      

  6.   

    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);
    }
      

  7.   

    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 控件。