?? dllmanager.cpp
字號:
// DLLManager.cpp: implementation of the CDLLManager class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "PlugIn_Main.h"
#include "DLLManager.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//定義插件DLL中初始化函數類型
typedef UINT (*PINITFUNC)(CToolBar *m_wndToolbar);
//定義插件DLL中釋放插件函數類型
typedef void (*PDESTROYFUNC)();
//定義插件DLL中得到插件名函數類型
typedef UINT (*PPLUGINNAMEFUNC)(CString *szPlugInName);
//定義插件DLL中插件按鈕點擊事件函數類型
typedef VOID (*PLUGINMSGHANDLER) ();
//定義插件DLL中得到插件資源函數類型
typedef VOID (*PLUGINRESOURCE) (HICON*, CString*);
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//構造函數
CDLLManager::CDLLManager()
{
m_szDLLFileName = _T("");
m_unToolBarID = 0;
m_szPlugInName = _T("");
m_pDLLhInstance = NULL;
m_pwndToolBar = NULL;
}
//析構函數
CDLLManager::~CDLLManager()
{
FreeDLL();
m_pDLLhInstance = NULL;
m_pwndToolBar = NULL;
}
/*
*函數介紹:裝載插件DLL
*入口參數:szFileName : 表示被裝載的插件DLL文件名
*出口參數:(無)
*返 回 值:TRUE:表示裝載成功; FALSE:表示裝載失敗
*/
bool CDLLManager::LoadDLL(CString szFileName)
{
//設置DLL文件名
m_szDLLFileName = szFileName;
//裝載DLL
HMODULE hModule = LoadLibrary(szFileName);
if (!hModule)
{
m_pDLLhInstance = NULL;
return false;
}
else
{
m_pDLLhInstance = hModule;
}
return true;
}
/*
*函數介紹:釋放加載的插件DLL
*入口參數:(無)
*出口參數:(無)
*返 回 值:TRUE:釋放成功 ; FALSE: 釋放失敗
*/
bool CDLLManager::FreeDLL()
{
bool bFuncCalled = false;
if (m_pDLLhInstance != NULL)
{
//先調用插件DLL中DestroyPlugIn函數釋放插件
PDESTROYFUNC pDestroyFunc = (PDESTROYFUNC)GetProcAddress(m_pDLLhInstance, _T("DestroyPlugIn"));
if (pDestroyFunc != NULL)
{
pDestroyFunc();
bFuncCalled = true;
}
else
{
bFuncCalled = false;
}
//釋放插件DLL
FreeLibrary(m_pDLLhInstance);
//設置默認參數
m_pDLLhInstance = NULL;
m_szDLLFileName = "" ;
}
return bFuncCalled;
}
/*
*函數介紹:調用插件中InitPlugIn方法,來初始化插件
*入口參數:(無)
*出口參數:(無)
*返 回 值:TRUE:初始化插件成功 ; FALSE: 初始化插件失敗
*/
bool CDLLManager::InitDLL()
{
bool bFuncCalled = false;
//判斷DLL是否被裝載,如果未裝載,則調用LoadDLL函數來加載dll
if ( m_pDLLhInstance == NULL )
{
if (!LoadDLL(m_szDLLFileName))
{
return false;
}
}
//得到插件中InitPlugIn函數地址
PINITFUNC pInitFunc = (PINITFUNC)GetProcAddress(m_pDLLhInstance, _T("InitPlugIn"));
//成功得到InitPlugIn函數地址的話,則執行此函數
if (pInitFunc != NULL)
{
m_unToolBarID = pInitFunc(m_pwndToolBar);
bFuncCalled = true;
}
else
{
//得到InitPlugIn函數地址失敗的話,則調用FreeDLL釋放dll
FreeDLL();
bFuncCalled = false;
}
return bFuncCalled;
}
/*
*函數介紹:得到插件名稱
*入口參數:(無)
*出口參數:szName : 用來存儲得到的插件名稱
*返 回 值:TRUE:得到插件名稱成功 ; FALSE:得到插件名稱失敗
*/
bool CDLLManager::GetDLLName(CString *szName)
{
//判斷DLL是否被裝載,如果未裝載,則調用LoadDLL函數來加載dll
if ( m_pDLLhInstance == NULL )
{
if (!LoadDLL(m_szDLLFileName))
{
return false;
}
}
//得到插件中GetPlugInName函數地址
PPLUGINNAMEFUNC pFunc = (PPLUGINNAMEFUNC)GetProcAddress(m_pDLLhInstance, _T("GetPlugInName"));
if (pFunc == NULL)
{
//得到GetPlugInName函數地址失敗的話,則調用FreeDLL釋放dll
FreeDLL();
return false;
}
//成功的話,執行此函數
pFunc(szName);
return true;
}
/*
*函數介紹:點擊ToolBar上的按鈕事件
*入口參數:(無)
*出口參數:(無)
*返 回 值:TRUE:成功執行 ; FALSE: 執行失敗
*/
bool CDLLManager::HandleOnClick()
{
//判斷DLL是否被裝載,如果未裝載,則調用LoadDLL函數來加載dll
if ( m_pDLLhInstance == NULL )
{
if (!LoadDLL(m_szDLLFileName))
{
return false;
}
}
//得到插件中HandleOnClick函數地址
PLUGINMSGHANDLER pFunc = (PLUGINMSGHANDLER)GetProcAddress(m_pDLLhInstance, _T("HandleOnClick"));
if (pFunc == NULL)
{
//得到HandleOnClick函數地址失敗的話,則調用FreeDLL釋放dll
FreeDLL();
return false;
}
//成功的話,執行此函數
pFunc();
return true;
}
/*
*函數介紹:得到插件圖標和插件標題
*入口參數:(無)
*出口參數: hIcon : 存儲得到圖標句柄
szLabel : 存儲插件標題
*返 回 值: TRUE:執行成功 ; FALSE: 執行失敗
*/
bool CDLLManager::GetPlugInResources(HICON *hIcon, CString *szLabel)
{
//判斷DLL是否被裝載,如果未裝載,則調用LoadDLL函數來加載dll
if ( m_pDLLhInstance == NULL )
{
if (!LoadDLL(m_szDLLFileName))
{
return false;
}
}
//得到插件中GetPlugInResources函數地址
PLUGINRESOURCE pFunc = (PLUGINRESOURCE)GetProcAddress(m_pDLLhInstance, _T("GetPlugInResources"));
if (pFunc == NULL)
{
//得到GetPlugInResources函數地址失敗的話,則調用FreeDLL釋放dll
FreeDLL();
return false;
}
//成功的話,執行此函數
pFunc(hIcon,szLabel);
return true;
}
/*
*函數介紹:設置工具欄對象指針
*入口參數:pWndToolBar : 工具欄對象指針
*出口參數:(無)
*返 回 值:(無)
*/
void CDLLManager::SetToolBarPointer(CToolBar *pWndToolBar)
{
m_pwndToolBar = pWndToolBar;
}
/*
*函數介紹:得到插件按鈕標識
*入口參數:(無)
*出口參數:(無)
*返 回 值:返回插件按鈕標識
*/
UINT CDLLManager::GetToolBarButtonID()
{
return m_unToolBarID;
}
/*
*函數介紹:設置插件DLL物理文件名
*入口參數:szFileName : 插件DLL物理文件名
*出口參數:(無)
*返 回 值:(無)
*/
void CDLLManager::SetDLLFileName(CString szFileName)
{
m_szDLLFileName = szFileName;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -