• VS видит тело функции, почему возникает ошибка LNK2001?

    @communistic_sistema Автор вопроса
    Dmitrii, разве в срр запись using namespace tokenoperator::dte_token::stream; не работает? И оно выдает другую функцию?
    Написано
  • Как экспортировать экземпляр класса из DLL при LoadLibrary?

    @communistic_sistema Автор вопроса
    jcmvbkbc, да, гипотеза рабочая, но несмотря на это не понимаю, как в одном случае деструктор не вызвался, а в другом вызвался, несмотря на то, что конструктор и добавление одинаковое
  • Как экспортировать экземпляр класса из DLL при LoadLibrary?

    @communistic_sistema Автор вопроса
    а почему тогда здесь такого не происходит и вызов функции из этого же объекта не вызывает ошибки? просто не успевает появиться мусор?
  • Как экспортировать экземпляр класса из DLL при LoadLibrary?

    @communistic_sistema Автор вопроса
    jcmvbkbc,
    Вот это место я и просил прояснить. Покажи код, который не работает.

    https://github.com/dte-devteam/DynamicTokenEngine/...
    строка 95 например (берем стркуру из ветора, кладем указатель из ее поля, чтобы по нему вызвать i->f())
    при дебаге вылетает ошибка чтения vfptr но при этом я спокойно могу читать по указателю поля i, причем я полностью уверен, что вызывается именно тот i, что мне нужен и с параметрами, что не приведут к ошибке
    Может я неверно выразился про экспорт относительно dll, но в плане программы экспорт осуществляется указателем на вектор.
    static/inline имеют совершенно одинаковый результат
  • Как экспортировать экземпляр класса из DLL при LoadLibrary?

    @communistic_sistema Автор вопроса
    у меня экспортируется вектор, передача вектора укзателей - работает виртуальная функция, передача структур с этим указателем - виртуальная функция не работает
  • Как экспортировать экземпляр класса из DLL при LoadLibrary?

    @communistic_sistema Автор вопроса
    jcmvbkbc, error LNK2005 если не static и не inline. Код лучше пришлю файлом репозитория. Там 2 вектора. Оба экспортируются. По указателям первого все работает, по полю принимающее значение указателя - нет.
    https://github.com/dte-devteam/DTE-HWND/blob/maste...
    но при этом по непонятной мне причине в следующей dll таких проблем нет, что в векторе с указателями, что в векторе со структурами с полем-указателем все рабочее:
    https://github.com/dte-devteam/DTE-algebra/blob/ma...
  • Как обеспечить зависимость от проекта другого решения в visual studio?

    @communistic_sistema Автор вопроса
    Илья Голец, в с++ без cmake создать плагин можно?
    под клиентом я понимал базовую dll
  • Как обеспечить зависимость от проекта другого решения в visual studio?

    @communistic_sistema Автор вопроса
    Илья Голец, у меня в модулях-dll есть классы наследники классов базовой dll. В случае плагинов там действия не связаны с клиентом - нет зависимости от клиента, зависит только от действий клиента.
    В базовой dll есть абстрактный класс basicfunction, который имеет внутри себя поля для описания логики, все остальные импортируемые классы (в модуле-dll) должны быть его наследниками, ибо хранятся как basicfunction* в векторе базовой dll.
    у меня код на С++ (не знаю, зачем убрали тег), а для NET я нахожу только VB, C#, а для С/С++ только упоминание, у вас есть ссылки, где это сделано для С++?
  • Как обеспечить зависимость от проекта другого решения в visual studio?

    @communistic_sistema Автор вопроса
    Илья Голец, есть ехе с зависимостью от dll (назовем ее базовой). Базовая dll дает интерфейс для самого ехе и для dll-модулей.
    У меня решение, где лежит проект ехе, проект базовой dll и проект модуля-dll. В будущем будет больше модулей-dll. То есть в решении будет больше проектов и они буду огромным списком. Плюс хотелось бы разграничить решение модулей от решения ехе+базовая dll от модулей-dll (ибо в модулях уже свои проекты могут добавиться). Если ничего не предпринять будет месево из ехе, базовой dll, dll-модулей и других проектов, нацеленных на работу с dll-модулями.
    CMake это вопрос относительно вашего ответа в пункте о микросервисах.
    slnf я не хотел бы принимать ибо модули могут писаться не мной и в других репозиториях.
  • Как обеспечить зависимость от проекта другого решения в visual studio?

    @communistic_sistema Автор вопроса
    Для каждого проекта придется делать репозиторий? Нельзя ли такое сделать для решения?
    Плюс как избежать копирования проекта в проект при git-submodules (чтобы копировался как проект наравне с существующими)?
    Будет ли CMake хорошим решением для микросервисов?
  • Как обеспечить зависимость от проекта другого решения в visual studio?

    @communistic_sistema Автор вопроса
    что отмерять и что резать?
    возможно ли обойтись без .NET? У меня программа на с++.
  • Как добавить папку в проект dll Visual Studio?

    @communistic_sistema Автор вопроса
    Евгений Шатунов, ссылка, что вы прислали про include имеет пункт 1 - поиск по локальной директории. ../pch.h через локальную папку add выходит в корень проекта, где и лежит pch.h. Так что это не объясняет ошибку.
    Про inline - я не знаю других вариантов решения ODR для переменных, что объявляются в пространстве имен.
  • Как добавить папку в проект dll Visual Studio?

    @communistic_sistema Автор вопроса
    Евгений Шатунов, с ошибкой 2005 разобрался - inline, с ошибкой 1010 - нет. В заголовки никто не учил вставлять, я просто уже от безнадежности повтыкал куда только можно. Имеено папки, а не фильтры.
    Когда заменил ../pch.h на pch.h все заработало, но почему я не понимаю. Ведь заголовка pch.h не существует в папке add.
  • Как добавить папку в проект dll Visual Studio?

    @communistic_sistema Автор вопроса
    Евгений Шатунов, вопрос исправил, привел конкретный код. А сам основной вопрос прямо перед кодом - почему с пакой ошибка 1010 и почему при импорте в пустой файл ошибка 2005
  • Как эффективно хранить неопределенное количество разных типов данных?

    @communistic_sistema Автор вопроса
    Román Mirilaczvili, в итоге у меня система типа
    struct iterator {
      void* data;
    };
    vector<vector<iterator>> memory;

    Я пренебрег дефрагментацией (считая что память будет в основном только выделяться), я пренебрег полностью типами, так что невозможно определить что хранится внутри void*, только создатель должен это знать или функции знакомые с создателем (тип указывается как id), но это вполне достаточно (исключение - классы, любые, они должны быть в итоге уничтожены правильным деструктором, который является частью функции создателя/функции знакомой со создателем).
    Внутренний вектор хранит iteratorы с void* одного size_t (и инициализация идет последовательно, так что сначала инициализируются одни размеры, потом другие, так что это дает некоторые шансы избежать фрагментации при изменении размера с x на y и с y на х, где x > y. Плюс не нужно производить реалокацию, потому что оно заполняется относительно плотно. Также учитывая, что современные компьютеры имеют очень много памяти, фрагментация считается допустимой.
    Плюс у меня контекст создания памяти это ее создание еще до запуска скриптов, ее использующих. Дальнейшие действия с изменением ее объема будут крайне редки.
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    Спасибо за ответы и примеры. Это правильные решения. Но я выберу решение Wataru, потому что у меня не возможно отследить является ли shared_ptr единственным на экземпляр данных. Я создам небольшое кол-во классов, которые только они доступны для удаления.
    Проверь этот код. Где в нем утечка и почему в нем не должен вызываться деструктор?
    Предлагаю просто не утверждать того, в чем ты не убедился лично.
    - Евгений Шатунов
    Я не знаю как еще понимать комбинацию
    Деструктор — это функция-член, которая вызывается автоматически при выходе объекта из области действия или явно уничтожена вызовом delete
    от Майкрософт и
    member function may only be called with a pointer to a complete type
    от cppreference в случае деструктора для std::shared_ptr
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    Евгений Шатунов, как мне умные указатели помогут в структуре vector<shared_ptr<void>>? Ну может я не настолько хорошо понимаю разницу в утечке памяти и ресурса, но она есть. И то, что если я начну использовать такую конструкцию, не позволит мне избежать утечки.
    Вы мне предлагаете не то, и я поясняю почему это не то. Я говорю - shared_ptr не вызовет деструктор класса. Утечка есть, все плохо.
    У меня нет цели вообще выражать свое мнение по умным указателям, я спрашиваю конкретные способы.
    Если умные указатели могут привести функцию экземпляра (вызывающую деструктор себя) к shared_ptr, то так и скажите, пожалуйста! Это будет прекрасным решением этой проблемы.
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    Игорь Кузьмич, я не знаю что за незнакомые слова я тебе говорю.
    Вероятно слово "каст".
    (string*)ptr - это каст. Из void* в string*. Если использовать твою идею то это в каждом dll надо писать функцию с кучей кастов. Например
    switch(type):
    case 0:
      delete (int*)ptr;
      return true;
    default:
      return false;

    и в случае объявления указателя на класс из этого модуля - дать ему указатель на сам класс, тип класса (enum например), указатель на функцию с этим enum.
    но это очень много case, поэтому я спрашиваю, можно ли сделать без этого.
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    Игорь Кузьмич, Посмотрел - нельзя.
    void string_destructor(void* ptr)
    {
    delete (string*)ptr;
    }
    . В новом загруженном модуле не string, а class smclss и указатель smclss*. Это можно решить тем, что каст всех указателей идет в модуле, это означает писать кучу кастов в каждом модуле. По-другому нельзя?
  • Можно ли вызвать деструктор void*?

    @communistic_sistema Автор вопроса
    Игорь Кузьмич, variant - хорошее решение при известном числе типов, но опять же, число типов не известно в силу подключения новых модулей. Также я не уверен, что variant вообще позволяет вызывать деструкторы классов.