Я работаю над системой на основе плагинов, в которой для плагинов используются общие библиотеки. Я хочу настроить в этих библиотеках несколько статических переменных, чтобы можно было использовать их в разных местах, включая глобальные конструкторы. Могу ли я вызвать функцию из моего основного исполняемого файла в общей библиотеке, чтобы она запускалась перед моими глобальными конструкторами в указанной общей библиотеке? Независимо от того, использую ли я общую память или регистрирую статические переменные, передавая их в общую библиотеку, в противном случае этот код настройки будет выполняться после глобальных конструкторов внутри 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() {
Allocator allocator;
Allocator::SetAllocator(&allocator);
HINSTANCE dllHandle = LoadLibrary(L"Library.dll");
if (!dllHandle) {
printf("Could not load the dynamic library.\n");
return EXIT_FAILURE;
}
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
Загрузка dll c++: вызов функции перед конструкторами глобальных переменных ⇐ C++
Программы на C++. Форум разработчиков
1731297039
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() {
Allocator allocator;
Allocator::SetAllocator(&allocator);
HINSTANCE dllHandle = LoadLibrary(L"Library.dll");
if (!dllHandle) {
printf("Could not load the dynamic library.\n");
return EXIT_FAILURE;
}
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;
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79173576/c-dll-loading-call-function-before-global-variable-constructors[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия