在WinXp下运行正常,载入Dll文件正确,调用DllRegisterServer也正确.
注册表中有正常写入相应的数据,程序运行正常.在Vista下载入Dll文件正确,调用DllRegisterServer也正确.
但是注册表中却没有写入相应的数据.请问这是怎么回事?

解决方案 »

  1.   

    用 ShellExec 运行 regsvr32.exe 注册试试看
      

  2.   

    Vista系统下你的程序需要高权限运行才可以。
      

  3.   

    正因为不想用ShellExec ,所以才在代码中直接实现
      

  4.   

    是不是Vista下查看注册表有什么特殊技巧?
    我确实没看到注册dll后相应键值被修改,
    而在程序中直接用代码修改的注册表值是被正常修改了。
      

  5.   

    单独使用regsvr32.exe注册是正常的
      

  6.   

    代码如下,也是从网上摘抄的:
    BOOL COMRegister( LPCTSTR lpszCOMDLLFileName, BOOL bRegFlag )
    {
        //ActiveX控件的路径及文件名 
        CString strCOMDllFileName = lpszCOMDLLFileName;    if ( bRegFlag )
        {//注册
            //装载ActiveX控件 
            HINSTANCE hLib = LoadLibrary( strCOMDllFileName ); 
            if (hLib == (HINSTANCE)HINSTANCE_ERROR) 
            { 
                //AfxMessageBox( _T( "不能载入Dll文件!" ) );
    printf("不能载入Dll文件!");
                return FALSE; 
            }
    else
    {
    printf("正常载入Dll文件!\n");
    }        //获取注册函数DllRegisterServer地址 
            FARPROC lpDllEntryPoint; 
            lpDllEntryPoint = GetProcAddress (hLib,("DllRegisterServer"));         //调用注册函数DllRegisterServer 
            if(lpDllEntryPoint!=NULL) 
            { 
                if(FAILED((*lpDllEntryPoint)())) 
                { 
                    //AfxMessageBox( _T( "调用DllRegisterServer失败!" ) );
    printf("调用DllRegisterServer失败!\n");
                    FreeLibrary( hLib ); 
                    return FALSE; 
                }; 
            } 
            else 
            {
                //AfxMessageBox( _T( "调用 DllRegisterServer 失败!") );
    printf("调用DllRegisterServer成功!\n");
                return FALSE; 
            }
        }
        else
        {//反注册
            //装载ActiveX控件 
            HINSTANCE hLib = LoadLibrary( strCOMDllFileName ); 
            if (hLib == (HINSTANCE)HINSTANCE_ERROR) 
            { 
                //AfxMessageBox( _T( "不能载入Dll文件!" ) ); 
                return FALSE; 
            }         //获取反注册函数 DllUnregisterServer 地址 
            FARPROC lpDllEntryPoint; 
            lpDllEntryPoint = GetProcAddress (hLib, ("DllUnregisterServer")); 
            
            //调用注册函数 DllUnregisterServer 
            if( lpDllEntryPoint != NULL ) 
            { 
                if( FAILED((*lpDllEntryPoint)()) ) 
                { 
                    //AfxMessageBox( _T( "调用 DllUnregisterServer 失败!" ) ); 
                    FreeLibrary( hLib ); 
                    return FALSE; 
                }; 
            } 
            else 
            {
                //AfxMessageBox( _T( "调用 DllUnregisterServer 失败!") ); 
                return FALSE; 
            } }
    }
      

  7.   

    用regsvr32.exe能正常注册,那用代码肯定没问题