Как импортировать функцию DLL в C? - PullRequest
4 голосов
/ 29 августа 2010

Мне дали DLL, которую я пытаюсь использовать. DLL содержит функцию «отправить». вот что я сделал:

#include <stdio.h>
#include <Windows.h>

int main(int argc, char * argv[])
{
    HMODULE libHandle;

    if ((libHandle = LoadLibrary(TEXT("SendSMS.dll"))) == NULL)
    {
        printf("load failed\n");
        return 1;
    }
    if (GetProcAddress(libHandle, "send") == NULL)
    {
        printf("GetProcAddress failed\n");
        printf("%d\n", GetLastError());
        return 1;
    }
    return 0;
}

GetProcAddress возвращает NULL, а последнее значение ошибки - 127. (процедура не найдена)

Что я делаю не так?

Ответы [ 4 ]

4 голосов
/ 29 августа 2010

Код выглядит более или менее хорошо, поэтому, возможно, что-то не так с * .dll.Загрузите приложение Dependency Walker и проверьте, какие функции экспортируются этой библиотекой.

2 голосов
/ 30 августа 2010

Если вы работаете в 64-битной среде и «sendms.dll» скомпилирована, так как 32-битная библиотека загрузки не работает.Вам нужно скомпилировать ваш проект как 32-битный для загрузки DLL.

0 голосов
/ 30 августа 2010

Я заметил, что вы используете TEXT в LoadLibrary, но не в GetProcAddress. Если GetProcAddress неправильно интерпретирует вашу строку, возможно, он ищет неправильную функцию.

0 голосов
/ 30 августа 2010

Возможно, DLL не экспортирует такую ​​функцию.

Это обычно вызывается "украшениями", которые компилятор добавляет к имени функции.Например, «send» может фактически рассматриваться как:

  • _send
  • _send@4
  • ?send@@ABRACADABRA

Чтобы решить эту проблему, вам нужно сделать следующее:

  1. Воспользуйтесь утилитой «зависимость» (depen32.exe, поставляется с MSVC), чтобы просмотреть, что экспортирует ваша DLL .
  2. Если вы являетесь автором DLL - вы можете заставить имя экспорта быть тем, что вам нужно, используя файл «def» (для компоновщика)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...