今天项目中需要用C++实现对几个DLL文件的注册,查了许多资料,总结如下:
1 #include <SHLWAPI.H> 2 #pragma region DLL 注册与反注册 add by whl 3 #pragma comment(lib, "Shlwapi.lib") 4 bool RegistryDll(CString& szDllPath) 5 { 6 if (!(PathFileExists(szDllPath) && (!PathIsDirectory(szDllPath)))) 7 { 8 return FALSE; 9 } 10 LRESULT (CALLBACK* lpDllEntryPoint)(); 11 HINSTANCE hLib = LoadLibrary(szDllPath); 12 if (hLib < (HINSTANCE)HINSTANCE_ERROR) 13 return FALSE; 14 (FARPROC&)lpDllEntryPoint = GetProcAddress(hLib, "DllRegisterServer"); 15 BOOL bRet = FALSE; 16 if (lpDllEntryPoint != NULL) 17 { 18 HRESULT hr = (*lpDllEntryPoint)(); 19 bRet = SUCCEEDED(hr); 20 21 } 22 FreeLibrary(hLib); 23 return bRet; 24 } 25 26 //UnRegistryDll用来反注册DLL,参数是DLL的全路径,返回值代表注册成功或者失败(TRUE为成功)。 27 bool UnRegistryDll(CString& szDllPath) 28 { 29 if (!(PathFileExists(szDllPath) && (!PathIsDirectory(szDllPath)))) 30 { 31 return FALSE; 32 } 33 LRESULT (CALLBACK* lpDllEntryPoint)(); 34 HINSTANCE hLib = LoadLibrary(szDllPath); 35 if (hLib < (HINSTANCE)HINSTANCE_ERROR) 36 return FALSE; 37 (FARPROC&)lpDllEntryPoint = GetProcAddress(hLib, "DllUnregisterServer"); 38 BOOL bRet = FALSE; 39 if (lpDllEntryPoint != NULL) 40 { 41 HRESULT hr = (*lpDllEntryPoint)(); 42 bRet = SUCCEEDED(hr); 43 44 } 45 FreeLibrary(hLib); 46 return bRet; 47 } 48 #pragma endregion 49 50 #pragma region DLL 注册 51 WCHAR exeFullPath[MAX_PATH]; // Full path 52 GetModuleFileName(NULL,exeFullPath,MAX_PATH); 53 54 USES_CONVERSION; 55 CString str2; 56 str2.Format(L"%s",exeFullPath); 57 std::string str1 = W2A(str2.GetBuffer()); 58 str2.ReleaseBuffer(); 59 int pos = str1.find_last_of('\\',str1.length()-1); 60 std::string LibPath = str1.substr(0, pos); 61 std::string CPIHelperdllPath = LibPath + "\\Plugins\\1.dll"; 62 std::string FFSClientdllPath = LibPath + "\\2.dll"; 63 std::string FWPluginHelperdllPath = LibPath + "\\3.dll"; 64 65 CString CCPIHelperdllPath(CPIHelperdllPath.c_str()); 66 CString CFFSClientdllPath(FFSClientdllPath.c_str()); 67 CString CFWPluginHelperdllPath(FWPluginHelperdllPath.c_str()); 68 69 BOOL tag1 = RegistryDll(CCPIHelperdllPath); 70 BOOL tag2 = RegistryDll(CFFSClientdllPath); 71 BOOL tag3 = RegistryDll(CFWPluginHelperdllPath); 72 73 if (tag1 && tag2 && tag3) 74 { 75 ico_RegisterDLL.SetIcon(hIconOk); 76 } 77 else 78 { 79 ico_RegisterDLL.SetIcon(hIconNo); 80 } 81 #pragma endregion
实现过程中遇到的问题:
1、CString与string的转换
参考资料
http://bbs.csdn.net/topics/340143744