因为程序要求,需要编写安装和卸载程序,在安装程序中注册了三个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;
}
(注册和反注册是通过网上代码实现的):
#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;
}
我试着跟踪了一下,发现失败的那个DLL文件信息:
HRESULT hr = (*lpDllEntryPoint)();
bRet = SUCCEEDED(hr);hr的值是:Coinitialize has not been called,其他几个成功的Dll的hr的值是:S_OK
bRet的值是0,也就是说没成功了。于是分别在程序段开头和结尾加了两句语句:
CoInitialize(NULL);
CoUninitialize();
问题解决,只是还没完全搞明白这两函数的意思。