WriteProcessMemory std :: vector <any>custom любой класс - PullRequest
0 голосов
/ 14 апреля 2020

Как мне использовать Write Process Memory с std :: vector

Это работает, если я использую std :: vector

Я не уверен, что этот класс возвращает правильную информацию при использовании .Данные ()

class any
{
private:
    struct base {
        virtual ~base() {}
        virtual base* clone() const = 0;
    };
    template <typename T>
    struct data : base {
        data(T const& value) : value_(value) {}
        base* clone() const { return new data<T>(*this); }
        T value_;
    };
    base* ptr_;
public:
    template <typename T> any(T const& value) : ptr_(new data<T>(value)) {}
    any(any const& other) : ptr_(other.ptr_->clone()) {}
    any& operator= (any const& other) {
        any(other).swap(*this);
        return *this;
    }
    ~any() { delete this->ptr_; }
    void swap(any& other) { std::swap(this->ptr_, other.ptr_); }

    template <typename T>
    T& get() {
        return dynamic_cast<data<T>&>(*this->ptr_).value_;
    }
};

template<typename T>
size_t vectorsizeof(const typename std::vector<T>& vec)
{
    return sizeof(T) * vec.size();
}

std::vector<any> args{100, 1.1f};
WriteProcessMemory(hProc, pMemory, args.data(), vectorsizeof(args), nullptr)

1 Ответ

2 голосов
/ 14 апреля 2020

Должен быть простой способ использовать std :: any в векторе с записью в память процесса.

Нет, нет.

Игнорирование того, что std::any соответствует значению, которое оно хранит на данный момент, std::any сохраняет свое значение (как будто) косвенно. Это означает, что это скорее похоже на vector<T>; он хранит указатель на объект, который он выделил в куче (за исключением того, что T скрыт от типа, и он хранит только один из них). Таким образом, копирование битов самого any само по себе не (обязательно) сделает видимым T, который он хранит; Вы (возможно) копируете указатель, а не то, на что он указывает.

Более того, any не может быть доставлен в такие процессы по многим причинам. Даже если бы вы могли получить доступ к байтовому диапазону объекта, сохраняемого any, вы не сможете использовать его для восстановления any на другой стороне. И даже если бы вы как-то могли, вам как-то пришлось бы передавать type_index, который представляет тип, хранящийся в any. И , что не совместимо с несколькими процессами; значение индекса типа для определенного типа в одном процессе может отличаться от индекса для того же типа в другом процессе.

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

...