2010-11-08 2 views
1

В настоящее время я пытаюсь интегрировать DLL (FooEmulation) в существующий проект.Сохранение отдельных экземпляров статической памяти DLL

DLL предполагает, что он будет использоваться только для эмуляции одного Foo за один раз и в результате использует много статических глобальных переменных.
Однако, я хочу иметь возможность управлять тысячами Foo экземпляров сразу.

У меня есть источник исходной DLL, поэтому я могу преобразовать все статические глобальные значения в параметры, которые будут переданы (будь то напрямую или через дескриптор), но DLL поддерживается отдельно, и мне бы хотелось, чтобы избежать наложения/слияния, если это вообще возможно.

Один из методов, который я нашел, заключался в загрузке нескольких динамически сгенерированных копий DLL, но это слишком ресурсоемкое для необходимого мне масштаба. Я также не могу позволить себе создать процесс или нить для каждого Foo.

Возможно ли сохранить несколько копий статической памяти DLL и восстановить ее за использование библиотеки DLL?
Как его найти? Можно ли даже дотронуться до него?

+0

fwiw, это на Windows. – mskfisher

ответ

1

Когда вы загружаете DLL несколько раз в один и тот же процесс, все статические данные являются общими, период. Вам придется перепроектировать библиотеку так, чтобы все эти объекты могли динамически создаваться по мере необходимости во время выполнения.

+0

Я только хочу загрузить DLL один раз - я действительно хочу, чтобы поменять исходные статические данные, когда я вызываю функции DLL от имени 'FooB' и' FooA'. – mskfisher

+0

@ mskfisher: Понятно. Для этого вам нужно перепроектировать внутренние библиотеки. – sharptooth

0

Я предполагаю, что вы на окнах, так как нет ничего говорить мне иначе ..

Посмотрите here,, который является документация DLLMain в Windows. DLLMain имеет параметр, который говорит вам, если

  • Процесс прикрепляет (загружает DLL)
  • Процесса является отсоединением (выгрузки вашей DLL)
  • Нити подсоединения (загрузка на поток части ваша DLL)
  • нить отсоединение (выгрузка на поток части вашей DLL)

Если поймать процесс или поток событий и выделить (приложить)/свободный (отрывать) новый экземпляр вашей статики, я думаю, что это решит вашу проблему. Это немного взломано, но это сработает ... Вы должны быть осторожны, что вы делаете в DLLMain. Посмотрите в документах предупреждения о блокировке в DLLMain.

+0

Да, это Windows. – mskfisher

Смежные вопросы