Pages

Friday, September 4, 2009

Наглый импорт класса из DLL

На CodeProject есть очень старая статья "Using classes exported from a DLL using LoadLibrary"
Все так и работает - если есть только DLL и файл-заголовок, то можно создать объект класса и вызывать его методы.
Сама программа будет выглядеть так:
#include <Windows.h>
#include <cstdio>
#include "test_dll.h"

typedef void (WINAPI * PCTOR) ();
typedef int (WINAPI * PADD)(int, int);

int main()
{
HMODULE hLib = ::LoadLibraryW(L"test_dll.dll");
if (hLib == NULL)
return 0 ;

CCalc* pCalc = (CCalc*)malloc(sizeof(CCalc));
if (pCalc != NULL)
{
PCTOR pCtor = (PCTOR)GetProcAddress(hLib, "??0CCalc@@QAE@XZ");
if (pCtor != NULL)
{
__asm { MOV ECX, pCalc }
pCtor();
}

PADD pAdd = (PADD) GetProcAddress (hLib, "?Add@CCalc@@QAEHHH@Z");
if (pAdd != NULL)
{
__asm { MOV ECX, pCalc }
int nSum = pAdd (15, 10);

printf ("sum = %d\n", nSum);
}

free(pCalc);
}

FreeLibrary(hLib);
return 0;
}

Класс CCalc в данном примере очень простой:
#ifdef TEST_DLL_EXPORTS
#define TEST_DLL_API __declspec(dllexport)
#else
#define TEST_DLL_API __declspec(dllimport)
#endif

class TEST_DLL_API CCalc
{
public:
CCalc();
int Add(int x, int y);
};

No comments:

Post a Comment