Хранение отдельных экземпляров статической памяти DLL - PullRequest
1 голос
/ 08 ноября 2010

В настоящее время я пытаюсь интегрировать DLL (FooEmulation) в существующий проект.

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

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

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

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

Ответы [ 2 ]

1 голос
/ 08 ноября 2010

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

0 голосов
/ 08 ноября 2010

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

Взгляните здесь, , которая является документацией для DLLMain в Windows. В DLLMain есть параметр, который сообщает вам, если

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

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

...