C++ DLL注册

今天项目中需要用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

原文地址:https://www.cnblogs.com/whl2012/p/4242560.html