C++ DLL注册

时间:2021-01-20 17:56:31

今天项目中需要用C++实现对几个DLL文件的注册,查了许多资料,总结如下:

 #include <SHLWAPI.H>
#pragma region DLL 注册与反注册 add by whl
#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;
}
#pragma endregion #pragma region DLL 注册
WCHAR exeFullPath[MAX_PATH]; // Full path
GetModuleFileName(NULL,exeFullPath,MAX_PATH); USES_CONVERSION;
CString str2;
str2.Format(L"%s",exeFullPath);
std::string str1 = W2A(str2.GetBuffer());
str2.ReleaseBuffer();
int pos = str1.find_last_of('\\',str1.length()-);
std::string LibPath = str1.substr(, pos);
std::string CPIHelperdllPath = LibPath + "\\Plugins\\1.dll";
std::string FFSClientdllPath = LibPath + "\\2.dll";
std::string FWPluginHelperdllPath = LibPath + "\\3.dll"; CString CCPIHelperdllPath(CPIHelperdllPath.c_str());
CString CFFSClientdllPath(FFSClientdllPath.c_str());
CString CFWPluginHelperdllPath(FWPluginHelperdllPath.c_str()); BOOL tag1 = RegistryDll(CCPIHelperdllPath);
BOOL tag2 = RegistryDll(CFFSClientdllPath);
BOOL tag3 = RegistryDll(CFWPluginHelperdllPath); if (tag1 && tag2 && tag3)
{
ico_RegisterDLL.SetIcon(hIconOk);
}
else
{
ico_RegisterDLL.SetIcon(hIconNo);
}
#pragma endregion

实现过程中遇到的问题:

1、CString与string的转换

参考资料

http://bbs.csdn.net/topics/340143744