因为程序要求,需要编写安装和卸载程序,在安装程序中注册了三个DLL,但是在卸载时同样的方法却只能反注册掉其中两个,另一个文件是AudioDSP.Dll,能够被删除,但注册表中信息还在,大家有没有碰见过这种情况?该怎么解决?
(注册和反注册是通过网上代码实现的):
 #include <Shlwapi.h>   
 #pragma comment(lib, "Shlwapi.lib")      
 BOOL RegistryDll(CString& szDllPath)   
 {   
    if (!(PathFileExists(szDllPath) && (!PathIsDirectory(szDllPath))))   
     {   
         return FALSE;   
     }   
     LRESULT (CALLBACK* lpDllEntryPoint)();    
     HINSTANCE hLib = LoadLibrary(szDllPath);   
     if (hLib < (HINSTANCE)HINSTANCE_ERROR)    
         return FALSE;    
     (FARPROC&)lpDllEntryPoint = GetProcAddress(hLib, "DllRegisterServer");    
     BOOL bRet = FALSE;   
     if (lpDllEntryPoint != NULL)   
    {   
         HRESULT hr = (*lpDllEntryPoint)();   
         bRet = SUCCEEDED(hr);        }   
    FreeLibrary(hLib);   
    return bRet;   
 }   
  
 //UnRegistryDll用来反注册DLL,参数是DLL的全路径,返回值代表注册成功或者失败(TRUE为成功)。   
 BOOL UnRegistryDll(CString& szDllPath)   
 {   
     if (!(PathFileExists(szDllPath) && (!PathIsDirectory(szDllPath))))   
     {            return FALSE;   
     }   
     LRESULT (CALLBACK* lpDllEntryPoint)();    
     HINSTANCE hLib = LoadLibrary(szDllPath);   
     if (hLib < (HINSTANCE)HINSTANCE_ERROR)    
         return FALSE;    
     (FARPROC&)lpDllEntryPoint = GetProcAddress(hLib, "DllUnregisterServer");    
    BOOL bRet = FALSE;   
   if (lpDllEntryPoint != NULL)   
     {   
         HRESULT hr = (*lpDllEntryPoint)();   
        bRet = SUCCEEDED(hr);   
 
     }   
     FreeLibrary(hLib);   
     return bRet;   
 }   

解决方案 »

  1.   

    shellexecute 调用 regsvr32 -u
      

  2.   

    这个问题我已经解决了,把解决方法贴出来了:
    我试着跟踪了一下,发现失败的那个DLL文件信息:
      HRESULT hr = (*lpDllEntryPoint)();  
      bRet = SUCCEEDED(hr);hr的值是:Coinitialize has not been called,其他几个成功的Dll的hr的值是:S_OK
    bRet的值是0,也就是说没成功了。于是分别在程序段开头和结尾加了两句语句:
    CoInitialize(NULL);
    CoUninitialize();
    问题解决,只是还没完全搞明白这两函数的意思。