Написание библиотеки DLL, которая загружает msvcr80.dll и предоставляет функцию free ()

У меня есть сторонняя DLL, которая зависит от MSVCR80 и выделяет ресурсы, которые мне нужно очистить. Библиотека не предоставляет free-функцию для этого. Вместо этого мне нужно загрузить ту же библиотеку времени выполнения и вручную вызвать функцию free.

В качестве обходного пути я пытаюсь написать DLL-оболочку, которая загружает правильную среду выполнения и предоставляет функцию free. Эта DLL создается с помощью Visual Studio 2010 и зависит от отдельной библиотеки времени выполнения. Выполнение LoadLibrary("msvcr80.dll") завершается ошибкой R6034, которая, я думаю, связана с явными проблемами.

Можно ли вообще загрузить msvcr80.dll с помощью LoadLibrary? Нужно ли мне создавать манифест, вставлять его в DLL и хранить msvcr80.dll в том же каталоге, что и моя DLL-оболочка?

Я понимаю, что это недостаток сторонней библиотеки, но я в значительной степени застрял на этой версии. Заставить поставщика исправить это, скорее всего, не вариант.


person larsmoa    schedule 14.09.2011    source источник
comment
Посмотрите, помогают ли эти ссылки: cowwoc.blogspot. com / 2008/09 /, msdn.microsoft.com/en-us/library/ms235342%28v=vs.80%29.aspx   -  person paulsm4    schedule 14.09.2011
comment
Используйте api контекста активации с тем же ресурсом манифеста, который используется ошибочной dll. Это заставит вызов LoadLibray работать.   -  person David Heffernan    schedule 14.09.2011
comment
Вместо этого вам понадобится GetModuleHandle (), поскольку DLL уже загружена. Затем GetProcAddress (), чтобы получить адрес функции _free.   -  person Hans Passant    schedule 14.09.2011
comment
@hans проблема в том, что передать в качестве имени модуля. Это прекрасная штука с SxS. См. Предыдущий вопрос.   -  person David Heffernan    schedule 14.09.2011
comment
@David - сложно только имя каталога SxS, проблема для LoadLibrary. Не для GetModuleHandle, имя модуля просто msvcr80.   -  person Hans Passant    schedule 14.09.2011
comment
@ ханс, ты должен написать это в качестве ответа   -  person David Heffernan    schedule 14.09.2011
comment
@larsm Я взял идею Ганса и применил ее к вашему предыдущему вопросу. Я предполагаю, что вы все еще делаете это с помощью ctypes и Python. Я думаю, это означает, что вам не нужна DLL-оболочка C ++, которую вы описываете в этом вопросе. Я протестировал это, и все должно прекрасно работать с ctypes.   -  person David Heffernan    schedule 14.09.2011


Ответы (1)


Вероятно, есть решения получше, но в случае, если все остальное не помогло, вы могли бы где-нибудь найти копию VC ++ 2005 Express Edition (= бесплатно, пиратство не требуется ;)), которая использует версия 8.0 компилятора, а значит, та же среда выполнения дефектной dll.

Затем вы создадите с ней свою dll-оболочку, которая просто вызовет free, предоставленный его CRT (дважды проверьте, что вы используете версию dll!).

person Matteo Italia    schedule 14.09.2011
comment
VC ++ 2005 Express бесплатен только в том случае, если вы получаете его напрямую от Microsoft, и я не думаю, что они предлагают его больше. То, что он был бесплатным, не означает, что он не защищен авторским правом, и никто другой не имеет права его распространять. - person Mark Ransom; 14.09.2011
comment
Я не знал об этом лицензионном ограничении, но компилятор 8.0 все еще должен присутствовать в различных пакетах, которые все еще доступны на сайте MS (я помню, он использовался в последнем DDK до того, как они были переименованы в WDK). - person Matteo Italia; 14.09.2011
comment
Хорошая идея, и я бы, вероятно, сделал (что-то вроде) это, если бы не нашел другого решения моей первоначальной проблемы (см. stackoverflow.com/questions/7399774/ для получения подробной информации о проблеме + решение, которое я был работать с). - person larsmoa; 15.09.2011