Pull to refresh

Действительно простая в использовании обертка над 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");

На этом все. Благодарю за внимание.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.