Загрузка dll С++: вызов функции перед конструкторами глобальных переменныхC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Загрузка dll С++: вызов функции перед конструкторами глобальных переменных

Сообщение Anonymous »

Я работаю над системой на основе плагинов, в которой для плагинов используются общие библиотеки. Я хочу настроить в этих библиотеках несколько статических переменных, чтобы можно было использовать их в разных местах, включая глобальные конструкторы. Могу ли я вызвать функцию из моего основного исполняемого файла в общей библиотеке, чтобы она запускалась перед моими глобальными конструкторами в указанной общей библиотеке? Независимо от того, использую ли я общую память или регистрирую статические переменные, передавая их в общую библиотеку, в противном случае этот код настройки будет выполняться после глобальных конструкторов внутри dll.
Для дальнейшего контекста некоторые используют- случаи: регистраторы, распределители и консольные переменные/cvars. Все эти системы широко используются в программе, и я хочу иметь возможность использовать статические переменные из этих глобальных конструкторов. В частности, AutoCvars — это распространенный вариант использования, когда конкретную «переменную» можно использовать из файла, и для простоты она помещается в глобальное пространство, чтобы она могла немедленно получать данные и действовать в течение всего срока службы приложения: https://vkguide.dev/docs/extra-chapter/cvar_system/
Вот пример кода:
Allocator.hpp
#pragma once

class Allocator {
public:
static Allocator* GetAllocator();
static void SetAllocator(Allocator* allocator);

void* Allocate(size_t size);
size_t GetUsedSize() const;

protected:
static Allocator allocatorSingleton;
size_t usedSize = 0;
};

Allocator.cpp:
#include "Allocator.hpp"

static Allocator* allocatorState = nullptr;

Allocator* Allocator::GetAllocator() {
return allocatorState;
}

void Allocator::SetAllocator(Allocator* allocator) {
allocatorState = allocator;
}

void* Allocator::Allocate(size_t size) {
// ALLOCATION OCCURS HERE
usedSize += size;

return nullptr;
}

size_t Allocator::GetUsedSize() const {
return usedSize;
}


Main.cpp:
#include
#include
#include "Allocator.hpp"

int main() {
HINSTANCE dllHandle = LoadLibrary(L"Library.dll");
if (!dllHandle) {
printf("Could not load the dynamic library.\n");
return EXIT_FAILURE;
}

Allocator allocator;
Allocator::SetAllocator(&allocator);

printf("Allocated Size Before: %zu.\n", allocator.GetUsedSize());
auto fn = reinterpret_cast(GetProcAddress(dllHandle, "RegisterAllocator"));
if (!fn) {
printf("Could not locate the function.\n");
return EXIT_FAILURE;
}

fn(&allocator);
printf("Allocated Size After: %zu.\n", allocator.GetUsedSize());

return 0;
}

DllMain.cpp:
#include "../CVarTest/Allocator.hpp"

class SampleClass {
public:
SampleClass() {
Allocator::GetAllocator()->Allocate(42);
}
};

// Here, SampleClass doesn't work, and causes an error. This is what I want to get working.
SampleClass myInstance;

extern "C" {
void __declspec(dllexport) RegisterAllocator(Allocator* sourceAllocator) {
Allocator::SetAllocator(sourceAllocator);

// Here, SampleClass does work, and the final usedSize is 42.
// SampleClass myInstance;
}
}


Подробнее здесь: https://stackoverflow.com/questions/791 ... nstructors
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»