Как вызвать функцию из dll по её адресу?

Всем доброго времени суток!

Суть проблемы: Необходимо вызвать функцию из dll "YMS" по её адресу с помощью отображения самой DLL на память. DLL уже добавлена, как часть проекта. Как это сделать?

Пример кода:

#include <iostream>
#include <Windows.h>

int main()
{
    int i, num, index,x1,x2,res;
    HANDLE hFile, hMap;
    LPVOID lpFile;
    char** lpFuncs, ** lpFuncName;
    PIMAGE_DOS_HEADER lpDOS;
    PIMAGE_NT_HEADERS32 lpNT;
    PIMAGE_SECTION_HEADER lpSections;
    PIMAGE_EXPORT_DIRECTORY lpExport;

    std::cout << "Input namber one: ";
    std::cin >> x1;
    std::cout << "Input namber two: ";
    std::cin >> x2;

    hFile = CreateFile(TEXT("..\\..\\YSS\\Debug\\YMS.dll"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
    hMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
    lpFile = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);
    lpDOS = (PIMAGE_DOS_HEADER)lpFile;
    lpNT = (PIMAGE_NT_HEADERS32)((DWORD)lpFile + lpDOS->e_lfanew);
    lpSections = IMAGE_FIRST_SECTION(lpNT);

    for (i = 0; i < lpNT->FileHeader.NumberOfSections; i++) {
        if (lpSections[i].VirtualAddress <= lpNT->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress &&
            lpSections[i].VirtualAddress + lpSections[i].Misc.VirtualSize >= lpNT->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress)break;
    }

    lpExport = (PIMAGE_EXPORT_DIRECTORY)((DWORD)lpFile + lpSections[i].PointerToRawData + (lpNT->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress - lpSections[i].VirtualAddress));

    num = lpExport->NumberOfNames;
    printf("Input index func: 0 - %d : ", lpExport->NumberOfNames - 1);
    std::cin >> index;

    /*lpFuncs = (char**)((DWORD)lpFile + lpSections[i].PointerToRawData + (lpExport->AddressOfNames - lpSections[i].VirtualAddress));
    lpFuncName = (char**)((DWORD)lpFile + lpSections[i].PointerToRawData + (lpFuncs[index] - lpSections[i].VirtualAddress));

    std::cout << x1;
    std::cout << x2;*/

    lpFuncs = (char**)((DWORD)lpFile + lpSections[i].PointerToRawData + (lpExport->AddressOfFunctions - lpSections[i].VirtualAddress));
    lpFuncName = (char**)((DWORD)lpFile + lpSections[i].PointerToRawData + (lpFuncs[index] - lpSections[i].VirtualAddress));

    typedef int Func(std::complex<double>, std::complex<double>);

    Func* f = (Func*)((DWORD)lpFile + lpSections[i].PointerToRawData + (lpFuncs[index] - lpSections[i].VirtualAddress));
    res = f(x1, x2);

    std::cout << res;

    return 0;
}

Код нужной DLL:

введите сюда описание изображения

Структура проекта:

введите сюда описание изображения


Ответы (0 шт):