Вызов Функций Из Dll - Getmodulehandle И Getprocaddres

  • Для просмотра чата и остального функционала вам нужно авторизоваться или пройти регистрацию!

Artem™

Новенький
Автор темы
22 Янв 2012
3
0
1
Добрый День=)​

Итак, мы с Вами все время пользуемся DLL только это использование скрыто за LIB и H файлами. Но ведь любой DLL можно вызывать и динамически. Вот пример вызова функции Win 32 API для удаления файлов - DeleteFile. Тип приложения Win32 Application

// TestAPI.cpp : Defines the entry point for the application.
//

#include "stdafx.h"

typedef BOOL (WINAPI *hDeleteFunc)(LPSTR lpStr);

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
hDeleteFunc hDelete=NULL;
HMODULE hKernel32=NULL;
hKernel32=GetModuleHandle("Kernel32");
if (hKernel32==NULL)
{
MessageBox(NULL,"Error Load Kernel32","Error",MB_OK);
return FALSE;
}
hDelete=(hDeleteFunc)GetProcAddress(hKernel32,"DeleteFileA");
if (hDelete==NULL)
{
MessageBox(NULL,"Error Load hDelete","Error",MB_OK);
return FALSE;
}
if ((*hDelete)((LPSTR)"c:\\1.txt"))
MessageBox(NULL,"Deleted","Message",MB_OK);
else
MessageBox(NULL,"Not Deleted","Message",MB_OK);

return 0;
}

Первой строкой мы создаем прототип функции для того, чтобы функция имела тип и была реализована проверка типов при передаче параметров. GetModuleHandle получает указатель на DLL:

HMODULE GetModuleHandle
(
LPCTSTR lpModuleName // Имя модуля
);

Эта функция возврашает указатель на модуль, если он загружен. Но Kernel32.Dll - это системная библиотека Windows и она находится в памяти всегда. Если это не так, то нужно использовать LoadLibrary:


HINSTANCE LoadLibrary
(
LPCTSTR lpLibFileName // Имя файла DLL
);

Вооружившись указателем на модуль мы можем получить адрес функции с помощью GetProcAddress:

FARPROC GetProcAddress
(
HMODULE hModule, // указатель на модуль
LPCSTR lpProcName // имя функции
);

Спасибо За просмотр=) С вами Был Artem™
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.