Действительно простая в использовании обертка над LoadLibrary() и GetProcAddress()
Ожидает приглашения
По мотивам статьи: Простая в использовании обертка над LoadLibrary() и GetProcAddress().
Я опущу сухую теорию про использование DLL в приложениях Windows (по этой тематике полно статей) и перейду непосредственно к решению. Предлагаемое решение я использую везде где мне необходимо вызвать функцию из какой-либо библиотеки Windows, и подключается единственным заголовочным файлом.
Решение работает для компилятора c++ VS5/VS6 и успешно мигрировало на VS2013.
Реализация простая как 5 копеек без использование кеширования, shared_ptr, дополнительных заголовочных файлов и простыней кода.
Использование. Вызовем мифическую функцию SomeProcName из библиотеки Some.dll:
На этом все. Благодарю за внимание.
Я опущу сухую теорию про использование DLL в приложениях Windows (по этой тематике полно статей) и перейду непосредственно к решению. Предлагаемое решение я использую везде где мне необходимо вызвать функцию из какой-либо библиотеки Windows, и подключается единственным заголовочным файлом.
Решение работает для компилятора c++ VS5/VS6 и успешно мигрировало на VS2013.
Реализация простая как 5 копеек без использование кеширования, shared_ptr, дополнительных заголовочных файлов и простыней кода.
Смотреть
template <class T>
class ProcLoader
{
public:
ProcLoader(char* pczNameLibrary, char* pczNameProcedure)
{
m_strNameLibrary = pczNameLibrary;
m_strNameProcedure = pczNameProcedure;
m_pProc = NULL;
m_hModule = NULL;
};
BOOL Load()
{
char czMess[1000] = "";
if(!(m_hModule = ::LoadLibrary(m_strNameLibrary)))
{
_snprintf(czMess, sizeof(czMess)-1, "Не могу загрузить %s", (LPCSTR)m_strNameLibrary);
::MessageBox(0, czMess, "Ошибка", MB_OK|MB_ICONSTOP);
return FALSE;
}
if(!(m_pProc = (T)::GetProcAddress((HMODULE)m_hModule, m_strNameProcedure)))
{
_snprintf(czMess, sizeof(czMess)-1, "Не найдена функция %s в модуле %s", (LPCSTR)m_strNameProcedure, (LPCSTR)m_strNameLibrary);
::MessageBox(0, czMess, "Ошибка", MB_OK|MB_ICONSTOP);
return FALSE;
}
return TRUE;
};
T operator *() const
{
return m_pProc;
}
~ProcLoader()
{
::FreeLibrary((HMODULE)m_hModule);
}
private:
ProcLoader() {};
ProcLoader& operator = (ProcLoader&)
{
return *this;
};
private:
T m_pProc;
CString m_strNameLibrary;
CString m_strNameProcedure;
HANDLE m_hModule;
};
Использование. Вызовем мифическую функцию SomeProcName из библиотеки Some.dll:
ProcLoader<int(__cdecl*)(LPWSTR)> loader("Some.dll", "SomeProcName");
if(!loader.Load())
return;
int res = (*loader)("send some string to dll");
На этом все. Благодарю за внимание.