C ++ Как предотвратить Winapi :: FreeLibrary удаления переменной? - PullRequest
1 голос
/ 25 сентября 2019

У меня есть DLL с lib.h:

#pragma once

#ifdef EXPORTS
#define API __declspec(dllexport)
#else
#define API __declspec(dllimport)
#endif

extern "C" API void test1(std::vector<ValueType*>* functions);

и lib.cpp:

#include "pch.h"
#include <iostream>
#include <vector>

#include "ValueType.h"
#include "NumberValue.h"

#include "TestLib.h"

void test1(std::vector<ValueType*>* functions) {
    functions->push_back(new NumberValue(123321));

И основной файл, который использует эту DLL:

#include <iostream>
#include <vector>
#include <Windows.h>   

#include "ValueType.h"  

using namespace std;   

typedef void (__cdecl* importedInitFunction)(std::vector<ValueType*>*);
importedInitFunction test1F;

std::vector<ValueType*> values;   

int main() {
    while (1) {
        HMODULE lib = LoadLibrary("DllTest1.dll");  
        test1F = (importedInitFunction)GetProcAddress(lib, "test1");
        test1F(&values);
        FreeLibrary(lib);
        std::cout << values.at(0)->asString();
        system("pause");
    }
    return 0;
}

Когда я пытаюсь скомпилировать свой код, я улавливаю ошибку, потому что values.at(0) удалено.Как предотвратить удаление моей переменной при вызове FreeLibrary (lib)?или Как реализовать альтернативный путь?

Другие используемые классы: ValueType.h:

#pragma once
#include <string>
class ValueType {
public:


    virtual double asDouble() { return 999; }
    virtual std::string asString() { return ""; }


};

NumberValue.h:

#pragma once
#include <string>
#include "ValueType.h"

class NumberValue : public ValueType {
public:

    double m_value;

    NumberValue(double value) : m_value(value) {}

    virtual double asDouble() {
        return m_value;
    }

    virtual std::string asString() {
        return std::to_string(m_value);
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...