Как освободить COM-экземпляр SQLServerCE от текущего запущенного процесса? - PullRequest
1 голос
/ 02 декабря 2009

Прошло много времени с тех пор, как я коснулся COM, так что будьте добры;) Это под WindowsCE 5.0 с SQLServerCE 2.0.

После вызова этого для загрузки SQLServerCE 2.0: -

IDBInitialize *pIDBInitialize = NULL;
CoCreateInstance(CLSID_SQLSERVERCE_2_0, NULL, CLSCTX_INPROC_SERVER, IID_IDBInitialize, (void**)&pIDBInitialize);

Загрузка модуля происходит для SSCE20.dll, который, очевидно, загружает механизм SQLServerCE в пространство процесса.

Что я не понимаю, так это если я сделаю это сразу после: -

pIDBInitialize->Release();

Я не вижу выгрузки модуля dll, поэтому SSCE20.dll (и друзья) все еще загружаются в мой процесс.

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

Во время выполнения я хочу иметь возможность полностью выгрузить dll SQLServerCE 2.0 из процесса, чтобы упростить обновление до 3.5SP1.

Я подозреваю, что это как-то связано с моделью совместно используемой dll, которую Microsoft использует под WindowsCE ... но я могу ошибаться:)

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

Дэвид.

1 Ответ

0 голосов
/ 02 декабря 2009

Я думаю, что CoFreeUnusedLibraries был отключен в более поздних версиях Windows (XP и вперед, если я правильно помню). То есть он ничего не делает.

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

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

Вы можете попробовать позвонить CoUninitialize и посмотреть, не вызывает ли это разгрузку.

...