建立一个mfc的dll,勾上automation的支持,其他默认,工程建完以后,并没有注册表文件。手动向里面添加一个注册表文件,然后填入表项。编译完成以后,注册表里的内容仍然没有被注册到注册表中。没办法,用regsvr32手动的注册了这个dll,总算在oleview里看到它,并可以成功展开看到它的接口了。可是这实在是太麻烦了,每次都要自己动手写出一个注册表,然后注册一下。难道是我rp问题,大家都是怎么做的,能让它自注册呢?

解决方案 »

  1.   

    ps:如果建立一个支持automation的exe工程,就会自己生成注册表文件,并自注册了。困惑
      

  2.   

    向导生成的exe工程,只是利用了编译事件而已楼主可以在能够自动注册(实际是编译成功后执行注册命令)的工程下,进入Project/Settings...下的CustomBuild标签页,将它的内容原版拷贝到楼主原来不支持自动注册的工程下的对应位置即可。
      

  3.   

    手动添加注册表文件?组件注册是通过组件自身的导出函数 STDAPI DllRegisterServer(void)完成的,它由regsvr32调用;手动往注册表里加当然可以,但是完全没必要。(危险!)
      

  4.   

    BOOL RegisterCom(LPTSTR ComName)
    {
        CHAR lpszPath[MAX_PATH];
    DWORD dwLength = MAX_PATH;
    BOOL bRet = ::SearchPath(NULL, ComName , NULL, dwLength,
    lpszPath, NULL);
    if(bRet)
    {
    HINSTANCE hOCX = NULL;
    #ifdef _AFXDLL
    hOCX = AfxLoadLibrary(lpszPath);
    #else
    hOCX = ::LoadLibrary(lpszPath);
    #endif
    if(hOCX == NULL)
    bRet = FALSE;
    else
    {
    #ifdef _UNICODE
    USES_CONVERSION;
    if(FAILED((*(GetProcAddress(hOCX, W2CA(_T("DllRegisterServer")))))()))
    {

    bRet = FALSE;
    }
    #else
    if(FAILED((*(GetProcAddress(hOCX, "DllRegisterServer")))()))
    {
    bRet = FALSE;
    }
    #endif#ifdef _AFXDLL
    AfxFreeLibrary(hOCX);
    #else
    ::FreeLibrary(hOCX);
    #endif
    }
    } return bRet;
    }
      

  5.   

    LOP兄,在我的可以自注册的工程里面也没有找到注册的编译事件,custombuild里面的描述和命令都是空的。而且就算有,那也是一个手动拷过来的过程,我是觉得为什么建一个mfc的自动化工程,还需要我手动的做些修改才能完成,那不是变的没有意义了。
      

  6.   

    编译事件(还分编译前事件和编译后事件)是VS.net中的说法,VC6中只是简单的用一个Custom Build来代替(相当于编译后事件)。我找了个VC6,生成了一个Automation的MFC DLL,它虽然生成了DllCanUnloadNow等导出函数,取没有生成自动注册命令(即没有填写Custom Build,正如楼主所说),这可能是向导自己的小失误。生成一个ActiveX控件的工程时,向导就填写了Custom Build。因此楼主可以将ActiveX控件工程中Custom Build下的内容考到Automation工程下。所谓的编译后事件(Custom Build),其实就是编译成功后执行某些命令,所以楼主如果嫌上面的拷贝麻烦,可以自己在Custom Build标签页下的命令编辑框中填写如下
    regsvr32 "$(TargetPath)" /s
    /s只是叫regsvr32不要弹出对话框。而在输出编辑框中随便填写一些字母(因为regsvr32没有输出)。而楼主所谓的要手动修改才能完成,就没有意义了,这应该是MFC DLL向导的一个小失误,楼主只得自己手动添加上面几行
      

  7.   

    谢谢lop兄的详细分析,如果说只有需要填上面一行,还好,可我每次都要自己添加注册表文件,那就比较郁闷了。