這是一段時間,因爲我觸及COM所以很好;)這是在WindowsCE 5.0與SQLServerCE 2.0。如何從當前正在運行的進程中釋放SQLServerCE的COM實例?
之後調用該加載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模型...但是,我可能是錯:)
由於提前,
大衛。
你是否在init/release之間做了任何事情,這些事情可能仍然存在於DLL中?例如。從GetDataSource() –
Nope返回的東西,對於我們在CoCreateInstance之後調用Release()的簡單測試。 很明顯,完整的代碼在IDBInitialize接口上執行Initialize()和拆卸Uninitialize()。 –
您可以執行以下調查:在調用CoCreateInstance()調用LoadLibrary()後,調用包含COM服務器的.dll,然後調用GetProcAddress()調用DllCanUnloadNow()。然後調用Release()並通過獲得的指針調用DllCanUnloadNow()並查看它返回的內容。如果它返回S_FALSE,這意味着COM服務器內部有問題。 – sharptooth