Как я могу обновить используемую COM DLL? - PullRequest
2 голосов
/ 29 декабря 2010

Одна часть написанного мною программного обеспечения - это COM dll.Другое программное обеспечение использует эту COM-библиотеку.

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

Вопрос в том, как я могу обновить используемую COM-библиотеку?

Я подумал о том, чтобы выдать сообщение с просьбой закрыть все приложения, использующие DLL, если ониспользуется, если это лучшее решение, как бы я узнал, использовался ли COM dll перед тем, как вывести сообщение?

Заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 29 декабря 2010

Если это просто вопрос определения, можете ли вы заменить файл, тогда это легко.Просто попробуйте открыть его с флагом обмена, который запрещает чтение.Это потерпит неудачу, если DLL загружена в другом процессе.Используйте _fsopen () или CreateFile ().Остерегайтесь состояния гонки.

Сложнее определить, в каких процессах загружен файл, CreateToolhelp32Snapshot () и Process32First / Next, а также Module32First / Next для перечисления процессов и библиотек DLL, которые они загрузили.По-прежнему сложно создать хорошую диагностику для пользователя, но имя процесса не так уж полезно.

3 голосов
/ 29 декабря 2010

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

2 голосов
/ 29 декабря 2010

Когда вы загрузили обновление, вы должны запустить третью программу (которую вы пишете), которая не имеет каких-либо зависимостей от вашего COM-компонента, или любую другую часть, которую нужно обновить.Этот модуль запуска или загрузчик должен завершить работу всех ваших частей, удалить их и установить обновление.После установки обновления вы можете перезапустить приложение.

Если вам необходимо также загрузить обновления в само средство обновления, ваша основная программа может это сделать.

0 голосов
/ 29 декабря 2010

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

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