Использование функций в DLL в C ++? - PullRequest
1 голос
/ 22 июля 2011

Я создал dll в c ++, используя __declspec (dllexport) перед именем класса.Теперь, когда я пытаюсь использовать его в другой программе на С ++, между ними происходит сбой.Когда я отладил его, я обнаружил, что указатель на функцию вообще не инициализируется.помогите мне плз.

using namespace std;

typedef void (*func)();

int main()

{

    func funcpointer;
    HINSTANCE xyz = LoadLibrary(TEXT("C:\\extra\\dll\\dlls\\debug\\random.dll"));
    funcpointer = (func)GetProcAddress(xyz,"get it");
    funcpointer();
    return 0;
}

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 22 июля 2011

Прежде всего, используйте DUMPBIN /EXPORTS yourdll.dll, чтобы увидеть, действительно ли экспортируется функция, которую вы ожидаете экспортировать, и ее точное имя.Если вы найдете название «искалеченный», вам, вероятно, нужно объявить функцию как extern "C".Как только вы определились с названием, ваш путь будет правильным.Проверьте также, что HINSTANCE xyz стал не нулевым после загрузки библиотеки.Если ноль, то вы возможно не достигли dll (не в пути поиска) или по какой-то причине он не может загрузиться, например, из-за отсутствия некоторых зависимостей.

1 голос
/ 22 июля 2011

При экспорте вашей функции используйте extern "C" fndecl.Это поможет получить неокрашенное имя или использовать def-файл.Чтобы проверить имя экспортируемой функции, используйте инструмент Dependency Walker (depen.exe).

Если у вас есть класс C ++, я бы посоветовал вам связать его с DLL.Используя GetProcAddress, было бы неудобно использовать класс C ++.

Эта ссылка также может быть вам интересна, если вы новичок в DLL: Пошаговое руководство. Создание и использование библиотеки динамических ссылок

1 голос
/ 22 июля 2011
  1. Вместо «получить» вы должны написать имя функции, которую вы хотите получить.
  2. Вы должны иметь не только dllexport, но и все определение dllexport / dllimport вЗаголовочный файл извлеченной функции:

    #if defined DLL_EXPORT   
    #define DECLDIR __declspec(dllexport)
    #else
    #define DECLDIR __declspec(dllimport)
    #endif
    
    extern "C"
    {
       DECLDIR void foo();
    }
    

Вы можете прочитать Учебник DLL для получения более подробной информации.

...