[問題] 多層dll load之後自動被OS unload的問題 …
小弟的工作遇到一個問題, 我們會提供一個介面dll讓AP使用....
而這個dll會再去呼叫底層我們提供的另一個dll來做事情....
用個簡單的圖解大概長得像這個樣子(PS. MS Windows + VC 2005/08)
static link
User AP ---------------> AAA.lib
^
| AP執行時會自動load dll
|
| LoadLibrary
AAA.dll ---------------> BBB.dll -> ....
AP必須先呼叫AAA的Initialize函數, 這個函數便會去LoadLibrary(BBB.dll)
結束前AP應該要呼叫AAA的DeInitialize函數, 那AAA會UnLoadLibrary(BBB.dll)
其中AAA裡會有一些context的管理, 但是主要工作是call進BBB.dll做事....
AAA還會使用GetProcessAddress取得BBB裡的一個主要的set function....
接著AAA利用這個set function傳入一個struct....
讓BBB把自己的介面function address寫進struct....
之後AAA就利用這些function pointer去叫BBB做事情....
當然也包含一些resource的動態create, destroy等等....
如果今天AP有好好的呼叫DeInitialize函數....
那麼AAA可以妥善的管理context資訊....
因為BBB的resource記錄在這些context裡...
並且依需要call進BBB去做內部資源的處理....
問題在於如果今天AP沒有好好的呼叫Terminate函數而逕行EXIT....
這時OS的機制是會先unload BBB.dll, 即BBB會先收到detachProcess....
然後才輪到AAA.dll, 即AAA會之後才收到detachProcess....
這樣AAA釋放資源發現有需要再call進BBB時就access violation了....
或者AAA會一直loop嘗試要call去free這些BBB的resource就無窮迴圈了....
所以現在小弟比較苦惱的是不太曉得該如何解決/避免這樣的問題....
最好是能讓OS不要主動/自動UnLoad dll, 而讓AAA來做UnLoadLibrary....
只是目前實測看windows的機制, 似乎難以避免這樣子的問題說....
合併AAA.dll與BBB.dll也是不可行的, 因為spec規定應該這麼做....
有想過一些方法, 不過好像都不是很好, 會破壞兩個dll的呼叫結構的感覺....
比如BBB.dll收到detachProcess時, 呼叫AAA.dll的某個function hint這件事....
(比如說重設function pointer啦, 設定某些flag讓AAA能知道這件事之類的)
並且自己把本來應該從AAA主動call進來處理的resource在此時全部釋放掉....
還是user mode的dll unload時, 動態要來的resource本來就會被OS free掉....
無窮迴圈什麼的OS等timeout了也會強迫關掉, 所以不用管它嗎??感覺很不好@_@"
所以小弟po上來請教大家的意見這樣....<(_ _)>
當然能強迫BBB.dll一定要由AAA.dll UnLoadLibrary就最好了XD
不然, 現在這樣子的架構與兩邊resource的管理大概要大修了Q_Q~
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.134.41.4
※ 編輯: VictorTom 來自: 220.134.41.4 (10/20 19:17)
→
10/20 22:36, , 1F
10/20 22:36, 1F
→
10/21 01:33, , 2F
10/21 01:33, 2F
→
10/21 01:33, , 3F
10/21 01:33, 3F
→
10/21 01:33, , 4F
10/21 01:33, 4F
→
10/21 01:34, , 5F
10/21 01:34, 5F
推
10/21 01:43, , 6F
10/21 01:43, 6F
→
10/21 01:46, , 7F
10/21 01:46, 7F
→
10/21 01:47, , 8F
10/21 01:47, 8F
→
10/21 01:47, , 9F
10/21 01:47, 9F
→
10/21 01:48, , 10F
10/21 01:48, 10F
推
10/21 10:43, , 11F
10/21 10:43, 11F
→
10/21 10:43, , 12F
10/21 10:43, 12F
→
10/21 10:46, , 13F
10/21 10:46, 13F
→
10/21 10:46, , 14F
10/21 10:46, 14F
→
10/21 10:47, , 15F
10/21 10:47, 15F
→
10/21 10:47, , 16F
10/21 10:47, 16F
→
10/21 10:47, , 17F
10/21 10:47, 17F
→
10/21 10:48, , 18F
10/21 10:48, 18F
推
10/21 14:59, , 19F
10/21 14:59, 19F
→
10/21 14:59, , 20F
10/21 14:59, 20F
→
10/21 14:59, , 21F
10/21 14:59, 21F