none
Потеря данных из DLL RRS feed

  • Общие обсуждения

  • Из DLL мне по указателю приходит list<>, смотрю в функцию перед отправкой - всё норм, прыгаю в основную функцию - на месте списка уже мусор. В чём может быть проблема?

    Этот метод создаёт список (в DLL):

    list<Line> *WebCore::getLinesList()
    {
        list<Line> *returnData=new list<Line>;
        return returnData;
    }

    Эти методы его вызывают:

    void PagesCreator::drawLines(list<Line>* lines)
    {
        for (list<Line>::iterator curItem = lines->begin(); curItem != lines->end(); curItem++) {
            Draw::drawLine(curItem->position, curItem->color, curItem->width);
        }
    }
    
    void PagesCreator::drawContent()
    {
        drawLines(_webCore.getLinesList());
        drawBoxes(_webCore.getBoxesList());
        drawTables(_webCore.getTablesList());
        drawPictures(_webCore.getPicturesList());
        drawTexts(_webCore.getTextsList());
    }


    12 ноября 2015 г. 14:12

Все ответы

  • Возможно неправильный calling convention при экспорте из DLL. 

    Переключите на ассемблер и посмотрите что делается с указателем.

    Так же можно добавить локальную переменную и посмотреть значение.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    12 ноября 2015 г. 17:00
    Модератор
  • Прикол в том, что адрес возвращается правильный, но если для головного модуля там мусор, то для DLL там нормальные данные. И такое кстати только с list<>, vector<> и т.д. Написал класс для теста - всё нормально пришло.
    12 ноября 2015 г. 20:01
  • Тогда загадка. Может по каким то причинам дестрактор вызывается? Поставьте брейкпоинт на нем...



    This posting is provided "AS IS" with no warranties, and confers no rights.

    12 ноября 2015 г. 23:06
    Модератор
  • Нет, всё хорошо. Данные (указатели в том числе) на примитивные типы, структуры (пробовал с RECT) и т.д. нормально приходят, такая ерунда только с STL. Может какие-то настройки студии изменить надо?
    13 ноября 2015 г. 6:33
  • Так не бывает. Если все хорошо то у вас все работает, а вы то и не знайте... :)

    Тут всего два варианта:

    1. Указатель неправильный.

    2. Память на которую он указывает поменялась.

    Других вариантов в общем то нет, так что изучайте вопрос исходя из этого. Например откройте окно с памятью в отладчике и посмотрите.

    У вас проблема во время выполнения, так что настройки студии едва ли помогут.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    13 ноября 2015 г. 16:56
    Модератор
  • Бывает, всё проверял. Я выделил память в DLL, передал указатель на ней в основной модуль, там мусор, прыгнул назад в DLL - как ни в чем не бывало.
    14 ноября 2015 г. 12:43
  • Это у вас часом не C++/CLI?

    This posting is provided "AS IS" with no warranties, and confers no rights.

    14 ноября 2015 г. 17:53
    Модератор
  • Здравствуйте. И в dll и в exe нужно использовать одну и ту же dll-версию библиотеки C++. И, ни в коем случае, не статическую, иначе в процессе будет 2 кучи.

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

    15 ноября 2015 г. 10:21