2011-09-03 136 views
3

我有一個VB6應用程序,安裝程序使用INNO Setup進行編譯。 安裝程序運行良好。但在大約10%的計算機上,當用戶單擊圖標運行已安裝的應用程序時,它不會啓動,也不會出現錯誤信息,只會發出嗶聲。VB6應用程序不會在某些計算機上運行,​​在其他計算機上運行良好

這是發生在XP和也贏得7

我在XP和Win 7的開發和應用工程確定,所以我一直無法重現該問題。

安裝程序註冊所有需要的ocx和dll(afaik)。 (好吧不是全部,它假設MS運行時組件應該在那裏,但我想如果缺少某些東西應該顯示一條錯誤消息)

我在想某種用戶權限,UAC,但甚至用戶管理員組有問題。

您能否指出我需要尋找和測試哪些可能的問題以修補應用程序。

謝謝!

[後續]

多虧了提示,發現了明顯的原因造成的問題。我用它來作對照更好看:

http://www.vbaccelerator.com/home/vb/code/libraries/xp_visual_styles/using_xp_visual_styles_in_vb/article.asp

現在我試圖發現爲什麼。我有另一個具有相同清單的應用程序,並且工作正常。

尚未能在事件查看器上獲得反饋。

+0

您需要確保所有依賴項都在目標計算機上。您是否嘗試過在事件查看器中查看是否記錄了錯誤?我以前遇到過MCI ocx的問題。 –

+0

應用程序是否爲ActiveX EXE? – wqw

+0

wqw:不,不是ActiveX Exe。 – Sunjen

回答

3

「嘟嘟聲崩潰」通常指向應用程序清單中的錯誤,如XML語法錯誤或namspace衝突。事件日誌通常會提供一個提示。

但我發現人們經常嘗試使用Common Controls 6.0 Library,但沒有確保正確的庫加載順序。

在任何窗體打開之前,您應該先載入shell32,然後載入comctl32。最簡單的方法是一對夫婦在子主空操作呼叫:

Option Explicit 

Private Declare Sub InitCommonControls Lib "comctl32"() 

Private Declare Function IsUserAnAdmin Lib "shell32"() As Long 

Private Sub InitCommonControlsVB() 
    IsUserAnAdmin 
    InitCommonControls 
End Sub 

Private Sub Main() 
    InitCommonControlsVB 
    Form1.Show 
End Sub 

如果沒有這個程序通常會正常工作在Vista或Win7的,但是無法對一些XP服務包和補丁級別。部分原因是由於處理SxS激活和comctl32.dll修補程序的Fusion子系統隨着時間的推移而發生變化。

忽略那些說你需要調用InitCommonControlsEx(),這是沒有必要的,除非你直接構造和使用Win32控件而不是VB6和COM控件。

+0

嗯..你讓我想到了清單xml。告訴客戶重命名「app.exe.manifest」文件,並嘗試,等待結果:) – Sunjen

+0

是的重命名或刪除「app.exe.manifest」文件後它再次工作!調試.. – Sunjen

2

有幾件事情要儘量縮小範圍:

檢查Windows事件日誌中的碰撞事件

檢查Windows事件日誌(在應用部分)從崩潰報告你應用。您可以通過點擊開始>運行,輸入eventvwr並按輸入,快速進入Windows XP上的日誌查看器。在Windows 7上,您可以在開始菜單中的搜索框中鍵入「事件查看器」。您可以過濾事件以僅顯示程序中的錯誤事件。

您可能在其中一臺出現此問題的計算機上發現了一些錯誤事件,因爲它聽起來像是在這些計算機上關閉了錯誤報告功能(在這種情況下會記錄訪問衝突等「硬崩潰」在事件日誌中,而不是向最終用戶顯示錯誤對話框,只要調試器未安裝在計算機上)。

確保「錯誤報告」在操作系統級開啓

正如前面所提到的,這聽起來像報告功能錯誤關閉這些計算機上。在這種情況下,崩潰不會向終端用戶顯示任何類型的消息,應用程序將突然消失。在Windows XP中,你可以檢查此設置(並打開)如下:

  1. 右鍵單擊「我的電腦」,選擇屬性
  2. 打開高級選項卡並單擊錯誤報告按鈕。
  3. 選擇啓用錯誤報告選項。
  4. 點擊確定到所有打開的窗口。

添加跟蹤代碼添加到您的應用程序

你也可以添加一些跟蹤代碼添加到您的應用程序的啓動代碼,如代碼以顯示一個消息框或寫郵件到Windows事件日誌或者在應用程序啓動後(例如,在主窗體的Form_Initialize事件或Sub Main例程中),將其保存到日誌文件中。

通過這種方式,您將能夠判斷應用程序是在加載VB6運行時之前還是之後崩潰:如果您嘗試啓動應用程序並且它消失/崩潰,並且啓動消息未記錄,那麼您在它甚至有機會到達您的應用程序的啓動代碼之前,它知道它崩潰了,這可能表明VB6運行時的依賴關係或VB6運行時本身沒有正確安裝。

請注意,Windows XP和Windows 7都預裝了VB6運行時,但它可能會導致行爲異常的安裝程序覆蓋或刪除屬於VB6運行時的文件。

+2

此外,如果您在代碼中放置了任何「On Error Resume Next」語句,我現在將它們評論出來。他們有一種隱藏你所有有用的錯誤信息的方法。 – feathj

+0

@jonfen:很好的電話。這完全滑了我的腦海。 –

+0

很棒,檢查你的提示 – Sunjen

相關問題