Создание и использование DLL в CPP

0

Я работаю над проектом, где я создаю небольшую DLL, а затем создаю приложение Windows для его использования.

Я не могу понять, что происходит.

У меня есть функция в DLL, называемая "startPicadorVisual", которая принимает один параметр, который является std :: string.

В приложении, которое зависит от DLL, у меня есть следующий код в основном автогенерированном файле.h:

typedef void (__stdcall *f_startPicadorVisual)(string s);

namespace PicadorPrototype {
    f_startPicadorVisual startPicadorVisual;
    Form1(void) {
    //Load DLL Funcs
    HINSTANCE hGetProcIDDLL = LoadLibrary(L"..\\Debug\\Picador.dll");

    if (!hGetProcIDDLL) {
        std::cout << "could not load the dynamic library" << std::endl;
        throw "Bad Stuff";
    }

    startPicadorVisual = (f_startPicadorVisual)GetProcAddress(hGetProcIDDLL, "startPicadorVisual");

    if (!startPicadorVisual) {
        std::cout << "could not locate the function" << std::endl;
        throw "More Bad Stuff";
    }

Когда это не удается на втором этапе, когда я вызываю GetProcAddress.

В моей DLL функции определяются следующим образом:

void __declspec(dllexport) startPicadorVisual(string fixtureNamet);
PicadorResults __declspec(dllexport) getPicadorReading(string fixtureName);

Может ли кто-нибудь сказать мне, почему это не работает?

  • 2
    Я верю, что это из-за искажения имени. stackoverflow.com/questions/1467144/...
  • 3
    Самый простой способ использовать DLL - это позволить среде выполнения C выполнить библиотеку загрузки и связь с динамической библиотекой. Когда вы компилируете и связываете DLL, должны быть созданы как минимум две вещи: (1) сам .dll и (2) файл .lib, который содержит заглушки для .dll. Вы можете связать с файлом .lib и включить файл .dll вместе с исполняемым файлом. Компоновщик свяжется с заглушками в файле .lib, который затем будет обрабатывать загрузку библиотеки и соединять различные заглушки с реальными функциями в .dll.
Показать ещё 2 комментария
Теги:
dll

1 ответ

3

GetProcAddress терпит неудачу, если имя, которое вы даете GetProcAddress, не соответствует точно названию функции, которую вы вызываете. Точно я имею в виду все - символы, которые составляют имя функции, имя функции должно совпадать с корпусом и т.д.

Таким образом, либо ваша DLL экспортировала другое имя, и вы этого не понимали, или вы вообще не экспортируете имя.

Вы можете легко найти имена экспортированных функций DLL, вы можете использовать программу Dependency Walker, найденную здесь: http://www.dependencywalker.com/

Кроме того, не рекомендуется использовать объекты C++, которые выделяют динамическую память, такую как std::string качестве параметров. Если вы это сделаете, ваша DLL будет работать только для приложений, которые

  1. Скомпилированы с той же версией Visual C++, что и DLL
  2. Используйте те же параметры компилятора при создании приложения и DLL
  3. Все компоненты (DLL и приложение) должны использовать DLL-версию библиотеки времени выполнения C.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню