Как вернуть вектор в DLL? - PullRequest
2 голосов
/ 21 марта 2011

Я разрабатываю систему плагинов для своего приложения.Мое программное обеспечение написано на MFC / c ++

Я выбираю импорт функций из DLL.Но я столкнулся с проблемой.Я написал с использованием библиотеки std, но SO показал мне, что «существует опасность передачи чего-либо в DLL-библиотеку и из нее, если она основана на шаблоне»

Так что я начал переписывать ее.Но сейчас я не могу найти хорошее решение.Эта dll будет анализировать Youtube и возвращать результаты в такой структуре:

struct VideoInfo{
wchar_t* strName;
wchar_t* strURL;
int iDuration;
float fRate;
};

Но будет 50 из них, в моем предыдущем коде я только что вернул std::vector<VideoInfo*> *vecVideos;, но как я могу это сделать вбезопасный путь?

Ответы [ 2 ]

2 голосов
/ 21 марта 2011

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

Не нужно беспокоиться о несовместимости, и она проста в использовании:

struct Node
{
    VideoInfo vi;
    Node *Next;
};

Когда вы создаете свой список видео, просто сделайте следующее:

Node *ptr = new Node();
ptr->vi = MyVideoInfo; // Assumes MyVideoInfo is the new video
ptr->Next = current;
current = ptr; // Assuming current is our current linked list

Вы можете даже использовать это в c, так как вам просто нужно обернуть его во внешний "C" {} и добавить typedef в начало вашего объявления узла.

1 голос
/ 21 марта 2011

Возвращать объекты C ++ небезопасно только тогда, когда DLL и EXE-файлы не были созданы с одинаковой конфигурацией проекта, с / MT вместо / MD или с разными версиями библиотеки времени выполнения. Во многих случаях это не практическая проблема, ммм.

Безопасный способ состоит в том, чтобы не требовать от EXE освобождения памяти, выделенной из кучи DLL. Или наоборот. Вы должны будете изменить свою структуру для начала, не может иметь wchar_t *. Вы бы написали экспортированную функцию для получения VideoInfo *, чтобы вызывающий мог передать буфер, который заполняет функция.

Но, повторюсь, если нет опасности, что DLL устареет, у вас не будет проблем ни с std :: vector, ни с std :: wstring.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...