如何从当前运行的进程中释放SQLServerCE的COM实例?

时间:2009-12-02 02:16:49

标签: c++ sql com sql-server-ce

我接触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清除任何未使用的库,但它似乎没有做到这一点。

在运行时,我希望能够从流程中完全卸载SQLServerCE 2.0 dll,以简化升级到3.5SP1。

我怀疑这与微软在WindowsCE下使用的共享dll模型有关......但是,我可能错了:)

提前致谢,

大卫。

1 个答案:

答案 0 :(得分:0)

我认为CoFreeUnusedLibraries已经在Windows的更高版本中被删除了(如果我没记错的话,XP和转发)。也就是说,它没有做任何事情。

A KB article在调用函数时提到了不应有的延迟,以最大程度地降低一个线程强制卸载另一个同时尝试从中创建实例的DLL的风险。

可能是他们对延迟卸载不满意(我认为它仍然存在可能的竞争条件),并决定完全删除功能。

您可以尝试拨打CoUninitialize并查看是否强制卸载。