Есть ли способ сбросить статические переменные в сторонних DLL к их исходным значениям? - PullRequest
4 голосов
/ 20 октября 2011

Мы должны использовать сторонние DLL в нашем процессе разработки, к сожалению, мы не можем изменить их или указать, как библиотека должна работать.

Разработчики оригинальной библиотеки ввели методы состояний в свои методы через статические переменные.

например:.

void foo()
{
 static int a = 1;
 if (a == 1)
 {
  /* some init logic */
  a = 2;
 } 
}

Иногда нам нужно привести библиотеку в исходное состояние.

Есть ли способ вернуть статические переменные к их исходным значениям без каких-либо системных "взломов"?

Наше текущее решение - FreeLibrary / LoadLibrary, но мы хотим этого избежать.

Ответы [ 4 ]

5 голосов
/ 20 октября 2011

Ваше текущее решение - самое чистое решение.

Единственная альтернатива - определить, где переменная хранится в DLL, и изменить ее напрямую. Но это грубый хак, который невероятно хрупок. Например, если сторонняя DLL-библиотека изменится, ваш хак может перестать работать с непредсказуемыми эффектами.

1 голос
/ 20 октября 2011

Область действия статических локальных переменных совпадает с областью автоматической локальной переменной (кроме того факта, что их значение будет присутствовать при следующем вызове функции).Так что нет, вы не можете изменить их без взлома.

1 голос
/ 20 октября 2011

К сожалению, нет, это невозможно без серьезных взломов.FreeLibrary / LoadLibrary ваш единственный вариант.

0 голосов
/ 20 октября 2011

Может быть, загрузить его с RTLD_LOCAL в другой раз, и только когда он загружен, переключите указатели на новые указатели библиотеки и выгрузите старую библиотеку. К сожалению, я не знаю, что такое Win32-эквивалент RTLD_LOCAL (если он есть).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...