Как стать автором
Обновить

Действительно простая в использовании обертка над LoadLibrary() и GetProcAddress()

По мотивам статьи: Простая в использовании обертка над LoadLibrary() и GetProcAddress().

Я опущу сухую теорию про использование 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");

На этом все. Благодарю за внимание.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.