2009-12-02 70 views
1

這是一段時間,因爲我觸及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模型...但是,我可能是錯:)

由於提前,

大衛。

+0

你是否在init/release之間做了任何事情,這些事情可能仍然存在於DLL中?例如。從GetDataSource() –

+0

Nope返回的東西,對於我們在CoCreateInstance之後調用Release()的簡單測試。 很明顯,完整的代碼在IDBInitialize接口上執行Initialize()和拆卸Uninitialize()。 –

+0

您可以執行以下調查:在調用CoCreateInstance()調用LoadLibrary()後,調用包含COM服務器的.dll,然後調用GetProcAddress()調用DllCanUnloadNow()。然後調用Release()並通過獲得的指針調用DllCanUnloadNow()並查看它返回的內容。如果它返回S_FALSE,這意味着COM服務器內部有問題。 – sharptooth

回答

0

我認爲CoFreeUnusedLibraries已被刪除在更高版本的Windows(XP和轉發,如果我沒記錯的話)。也就是說,它什麼都不做。

A KB article在調用函數時提到了不必要的延遲,以最大程度地降低一個線程強制卸載另一個同時嘗試創建實例的DLL的風險。

這可能是因爲他們不滿意延遲卸載(我認爲它仍然存在可能的競爭條件),並決定完全刪除功能。

您可以嘗試撥打CoUninitialize並查看是否強制卸載。

+0

當然,如果您在MTA中,CoUninitialize仍然無法卸載 - 我猜,應用了相同的限制。 –

+0

CoUninitialize()完成了這項工作,但所有的COM庫都是免費的,所以它有點大錘。 –

+0

是的,這不是一個真正的解決方案......但我有一個稍微噁心的想法。如果您確定沒有未完成的DLL引用,則可以在DLL文件名上調用CoLoadLibrary,然後在返回的句柄上調用CoFreeLibrary _twice_。既然它已經被加載過,你應該得到和COM加載它一樣的句柄。這就承擔了COM後來嘗試CoFreeLibrary的風險,並因爲句柄無效而爆發,但這可能值得一試。 –

相關問題