僅含資源的 DLL 是指僅包含資源而不包含其他項目的 DLL,例如,圖示、點陣圖、字串和對話方塊。使用僅含資源的 DLL 是在多個程式間共用一組相同資源的好方法,也是為應用程式提供當地語系化為多國語言的資源的好方法。
若要建立僅含資源的 DLL,請建立新 Win32 DLL (非 MFC) 專案,並且將您的資源加入專案。
- 在 [新增專案] 對話方塊中選取 [Win32 專案],並且在 [Win32 專案精靈] 中指定 DLL 專案類型。
- 為 DLL 建立包含資源 (例如字串或功能表) 的新資源指令碼,並儲存該 .rc 檔案。
- 在 [專案] 功能表上,按一下 [加入現有項目],並且將新的 .rc 檔案插入至專案。
- 指定 /NOENTRY 連結器選項。/NOENTRY 可以防止連結器將 _main 參考連結至 DLL;建立僅含資源的 DLL 時需要這個選項。
- 建置 DLL。
使用僅含資源的 DLL 的應用程式時應該要呼叫 LoadLibrary 來明確連結 DLL。若要存取資源,請呼叫可以使用在任何類型的資源的 FindResource 和 LoadResource 泛用函式,或者是呼叫下列資源特定函式的其中之一:
- FormatMessage
- LoadAccelerators
- LoadBitmap
- LoadCursor
- LoadIcon
- LoadMenu
- LoadString
應用程式應該在完成資源使用時呼叫 FreeLibrary。
範例程式
#include "..\Mod1res\resourceppc.h"
#include "WelComeModule.h"
WelComeModule::WelComeModule()
{
m_pWelcomeBitmap = 0x0;
}
WelComeModule::~WelComeModule()
{
SetActive(false);
}
void
WelComeModule::SetActive(bool bActive)
{
if (m_bIsActive==bActive)
return;
m_bIsActive = bActive;
if (m_bIsActive)
{
if (!m_pWelcomeBitmap)
m_pWelcomeBitmap = new CBitmap;
//載入資源DLL
if (!m_hResourceDLL)
m_hResourceDLL = (HINSTANCE)LoadLibrary(_T("Mod1res.dll"));
if(m_hResourceDLL)
{
m_hOldResource = AfxGetResourceHandle();
AfxSetResourceHandle(m_hResourceDLL);
HBITMAP hBitmap =
::LoadBitmap(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_WELCOME));
_bLoad = m_pWelcomeBitmap->Attach(hBitmap);
AfxSetResourceHandle(m_hOldResource);
m_hOldResource = 0x0;
}
else
m_bIsActive = false;
}
else
{
if (m_pWelcomeBitmap)
{
BOOL check = DeleteObject(m_pWelcomeBitmap->Detach());
delete m_pWelcomeBitmap;
m_pWelcomeBitmap = 0x0;
}
//卸載資源DLL
if (m_hResourceDLL)
{
if (FreeLibrary(m_hResourceDLL)==true)
m_hResourceDLL = 0x0;
}
}
}
void
WelComeModule::Render(CDC* pDC)
{
if (!m_bIsActive)
return;
if (!m_pWelcomeBitmap)
return;
//初始化Memory DC
CDC MemoryDC;
MemoryDC.CreateCompatibleDC(pDC);
//取得圖片尺寸
BITMAP bm;
m_pWelcomeBitmap->GetObject(sizeof(bm), &bm);
MemoryDC.SelectObject(m_pWelcomeBitmap);
//將圖貼到要秀的DC上
pDC->BitBlt(View_Offset, View_Offset, bm.bmWidth, bm.bmHeight,
&MemoryDC, 0, 0, SRCCOPY);
沒有留言:
張貼留言