GetProcAddress не может найти мои функции - PullRequest
4 голосов
/ 08 апреля 2010

Я создал DLL с функцией render () и хочу динамически загрузить ее в свое приложение, но GetProcAddress не может ее найти. Вот библиотека DLL .h:

#ifdef D3D_API_EXPORTS
#define D3D_API_API __declspec(dllexport)
#else
#define D3D_API_API __declspec(dllimport)
#endif

D3D_API_API void render();

А вот и DLL .cpp:

#include "stdafx.h"
#include "D3D_API.h"
#include <iostream>

D3D_API_API void render()
{
    std::cout << "method called." << std::endl;
}

Вот приложение, которое пытается использовать эту функцию:

#include "stdafx.h"
#include <windows.h>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
    HINSTANCE myDLL = LoadLibrary( L"D3D_API.dll" );

    if (myDLL == NULL) {
        std::cerr << "Loading of D3D_API.dll failed!" << std::endl;
    }

    typedef void (WINAPI *render_t)();

    render_t render = (render_t)GetProcAddress( myDLL, "render" );

    if (render == NULL) {
        std::cerr << "render() not found in .dll!" << std::endl;
    }
    return 0;
}

Моя цель - создать 3D-движок, который поддерживает D3D и OpenGL через свои собственные .DLL, используя унифицированный API. Я посмотрел на .dll в блокноте и там была строка "render".

1 Ответ

10 голосов
/ 09 апреля 2010

Экспортируемая вами функция обрабатывается как функция C ++ (из-за расширения файла * .cpp), поэтому C ++ искажение имени используется для оформления имени экспортируемой функции. Если вы используете инструмент Dependency Walker от Microsoft для проверки созданной вами DLL, вы увидите полное имя функции.

Вы можете использовать это декорированное имя в своем коде импорта или заставить компилятор экспортировать вашу функцию в стиле C, то есть в ее недекорированном виде, чего ожидает ваш текущий код импорта.

Вы можете указать компилятору сделать это, добавив extern "C" к сигнатуре вашей функции. Примерно так:

extern "C" D3D_API_API void render();

Теперь ваш код импорта должен работать как ожидаемый.

...