2017-10-11 108 views
-2

我有一個dao數據庫,它是單獨的dal中的init,即所有的ado和dao都存在seprate dll。Afxdaoterm何時使用

我已經爲某個目的創建了一個dll,並使用這個dll並初始化了dabase,它工作正常。

我已經創建了一個ocx,並初始化了這個數據庫它沒有工作我試圖調用退出實例afxdaoterm。

我的疑問是我們必須打電話給afxdaoterm嗎? Iam在很多地方啓動這個數據庫..我們可以打電話給afxdaoterm I'n destuctor ..它會崩潰一些..

我們必須在哪裏調用afxdaoterm?

回答

0

根本沒有必要調用AfxDaoTerm!

當調用AfxDaoInit時,將設置CWinApp中的狀態,並調用CWinApp:ExitInstance時調用AfxDaoTerm。

所以主要的問題是,你使用的是什麼樣的DLL。規則的DLL或擴展DLL?

在常規DLL中,每個DLL都有一個CWinApp對象。對於擴展DLL,CWinApp對象是從主進程共享的。

即使調用常規DLL AfxDaoTerm,當從不同的線程調用AfxDaoInit和AfxDaoTerm時,常規DLL上可能會出現問題。檢查這一點,並嘗試防止這一點。

由於常規DLL使用DllMain啓動InitInstance和ExitInstance。應該有一些代碼將使用過程中調用的單獨的Init和Uninit函數中的Dao內容隔離開來。

+0

在ocx中如果不調用afxdaoterm它給出中止錯誤..但是如果我在退出實例中調用它的循環 –

+0

請記住DLL中的ExitInstance是從DllMain調用的。您不能從DllMain調用這些函數。在InitInstance中執行它將會是一個問題。 DLL是一個代碼容器,不是進程或線程。 DLL不會像線程或進程那樣工作......將Init和Uninit函數分開,並讓它們從您需要的EXE中調用。 – xMRi