Процедура, используемая для создания экземпляра вашего класса COM из кода в вашей DLL, заключается в том, что Excel вызывает уровень библиотеки COM, чтобы найти вашу реализацию, используя либо ProgID, либо ClassID.Если у вас есть сервер inproc, это означает, что он находит путь к вашей DLL и использует LoadLibrary для загрузки его в ваш клиентский процесс, а затем создает фабрику классов и вызывает методы в DLL.Таким образом, конечный результат заключается в том, что Excel вызывает LoadLibrary для вашей DLL, и это блокирует файл, пока Excel не вызовет FreeLibrary для дескриптора.
Используя COM-интерфейсы, вы не можете это контролировать.Вы вызываете CoCreateInstance () (или из VBA вы создаете объект с помощью New или CreateObject, который вызывает этот Win32 API внизу).Реализация этого обрабатывает LoadLibrary и все остальное, пока вы не получите указатель интерфейса для работы.Некоторые приложения будут периодически вызывать CoFreeUnusedLibraries (), чтобы попытаться освободить загруженные COM-библиотеки, которые в данный момент не используются.Реализация фабрики классов по умолчанию поддерживает счетчик созданных объектов, который можно использовать, чтобы определить, используется ли DLL или нет - но это не всегда надежно, так как разработчики COM-классов могут не подчиняться правилам.Выход из Excel, очевидно, снимает блокировку файла.
Когда вы создаете свой COM-класс как внепроцессный сервер - он живет в отдельном исполняемом файле или DLL, время жизни которых управляется по-другому.Excel больше не удерживает блокировку DLL, и освобождение экземпляра COM вполне может позволить процессу хостинга завершиться.
Вы можете преобразовать DLL для использования в качестве локального сервера (вне процесса), организовавустроить его на DllHost.Если вы используете утилиту OleView и нашли ваши классы ProgId, вы можете включить хостинг в суррогатном процессе (dllhost).Прошло много времени с тех пор, как я это сделал, но в Интернете должна быть информация об использовании суррогатного хостинга.Очевидно, что размещение COM-объекта вне процесса замедляет работу и создает потенциальную возможность для различных проблем с сортировкой.При условии, что вы сохраняете совместимые с oleautomation интерфейсы, все должно быть в порядке.