2009-09-14 40 views
2

當調試一個VB6應用程序時,我注意到如果被調試的應用程序使用了VB6 IDE,那麼VB6 IDE將加載任何庫。庫在調試會話之間保持加載。這干擾了我的調試,因爲不幸的是,我們的一個庫(用delphi編寫)在全局變量中保持狀態,並且具有重要的初始化/終止邏輯。有沒有辦法強制VB6 IDE卸載庫?

該問題的簡單示例:我有一個foo.dll其中有一個計數器。我訪問該計數器,具有以下的VB6聲明:

Public Declare Function GetCounter Lib "foo.dll"() As Long 
Public Declare Function IncrementCounter Lib "foo.dll"() As Long 

在這種情況下的問題是,當我開始新的調試會話計數器不復位。我寧願不編寫應用程序或庫邏輯來考慮這種「回收庫狀態」方案。我希望能夠用乾淨的平板開始調試會話。

目前我強制通過重新啓動VB6 IDE卸載庫。有沒有更好的辦法?


編輯:我打了一下週圍與調用KERNEL32.DLL功能卸載從即時窗口/重裝libaries;這原來只是一個崩潰IDE或導致隨機行爲的好方法。我應該預料到,由於IDE無法知道它對圖書館的原始處理已經失效。

我已經接受了AngryHacker的答案,因爲我現在確信重新啓動vb6.exe是啓動VB6調試會話和完全清理板岩的唯一方法。

+2

我知道你已經聲明你不想這樣做,但我認爲你可以這樣做:顯式地從DLL中暴露一個方法來初始化/重新初始化,並在Vb6客戶端啓動時調用它。你也可以編寫一個顯式的關閉方法,當客戶端終止時調用,並從Form_Unload或類似的方法調用它。 – MarkJ 2009-09-15 13:12:54

回答

1

我一直在努力爭取多年,特別是在爲IIS站點使用ActiveX DLL的編碼時。

我發現的唯一真正的解毒劑是將庫加載到單獨的VB6實例中(假設您擁有源代碼的控制權)。這樣你就可以簡單地按下工具欄上的停止按鈕,並且庫不再被加載。

+0

這相當於重新啓動:一個vb6.exe進程被其他進程停止/啓動。 – 2009-09-15 11:50:32

+0

@wcoenen,正確:我認爲你可以把這個答案看作是一個「不,沒有更好的方法」,用另一種方法來做這件事也許同樣糟糕。無論如何,我投票+1,這是一個很好的答案。 – MarkJ 2009-09-15 13:10:38

0

你應該看看幾件事情:

  1. 確保你處置任何類的引用通過設置本地或全局變量=沒事的時候你的應用程序退出。
  2. 調試時,切勿點擊結束/停止調試按鈕。這只是把代碼中的地毯拉出來,有時候會把東西掛在內存中。
  3. 請勿在應用程序退出代碼中使用End命令(請參見第2點)。
+1

我不認爲這些會有所幫助。即使你做了所有這些,VB6也會將庫保存在內存中。 – MarkJ 2009-09-15 13:11:17

+0

不是以我的經驗。通常這個問題是自我造成的,儘管不容易追查。 – 2009-09-15 13:49:17

+0

我在這個問題中增加了一個非常簡單的例子(一個dll中的全局計數器)。如果你嘗試過,你會發現MarkJ是對的。如果你考慮到你的應用程序沒有運行時你可以從直接窗口調用外部dll函數,這也是非常合乎邏輯的。 – 2009-09-16 00:44:15

相關問題