2015-04-08 148 views
0

我在Visual Studio Community 2013下開發了一個簡單的C++程序(帶有Boost庫的命令行)。我想將它部署在其他Windows計算機上,所以我在Visual中測試InstallShield LE可以這樣做(我是InstallShield的新手)。我在當前的解決方案中添加了InstallShield項目,並且設法創建了一個setup.exe使用InstallShield部署的C++應用程序執行錯誤(windows)

當我測試在另一臺計算機上,安裝程序看起來不錯,但是當我嘗試應用程序,我有奇怪的錯誤:

MyProgramm.exe --help 

發送正確的結果(但它是不是真的很有趣)。

A problem caused the program to stop working correctly. Windows will close the program and notify you if a solution is available.

我錯過了什麼:

MyProgramm.exe -i InputDirectory -o OutputDirectory 

與Windows顯示此消息是否失敗?

我只構建了Release配置。我如何確定已經檢查了所有合併模塊或InstallShield先決條件?

+1

這與InstallShield有什麼關係?也許你的程序有你從未意識到的錯誤。 – PaulMcKenzie

+0

不,程序可以在計算機上正確運行。 – Melanie

+1

我會在這種情況下檢查的第一件事是如果您鏈接到調試crt dlls。這些都不是可再發行的,我認爲鏈接到它們會使這個錯誤出現在不安裝VS的不同機器上。否則,文件系統中可能存在程序邏輯未考慮的差異。 – antipattern

回答

0

您將不得不確定發生了什麼問題。通常,您描述的症狀表明異常導致進程終止。這種例外的一個常見來源是濫用無效指針。

但是它爲什麼在一臺計算機上工作,而不是另一臺?根據代碼,它可能是隨機的偶然事物。但只要每次重複這一點,就更有可能成爲環境問題。這可能意味着缺少數據文件,缺少註冊表項,缺少服務或缺少.dll依賴項。

因爲您可以至少以一種方式運行程序,所以您知道它不是靜態依賴項。如果是這樣,你會得到一個關於無法加載某個文件或其某個依賴關係的消息。但是在一些執行路徑中,您會看到崩潰。因此,如果它是一個依賴項,那麼InstallShield會調用一個動態依賴項。我個人不是很喜歡它(我寧願被告知究竟可能需要什麼),但有一個動態的依賴項掃描嚮導,可以幫助識別這些文件並將它們包括到項目中。

如果問題來自這樣的莖這隻會幫助:

HMODULE hMod = ::LoadLibrary(TEXT("SomeFunky.dll")); 
SOMEPROC proc = (SOMEPROC)::GetProcAddress(hMod, "SomeFunkyProc"); 
int result = proc(some, args); 

或許從一個COM相關的變種,看起來是這樣的:

CComPtr<ISomeFace> spSomeFace; 
HRESULT hr = spSomeFace.CoCreateInstance(CLSID_SomeFace); 
hr = spSomeFace->SomeMethod(some, args); 

常見問題這裏是沒有這些代碼塊驗證它調用的函數是安全的調用。在第一種情況下,proc(或甚至hMod)可能爲空;在第二種情況下,spSomeFace可能尚未成功創建實例。雖然代碼可以(也應該)阻止這些場景崩潰,但修復崩潰並不會讓您的應用程序實際執行所期望的操作,而且您仍然必須修復過程,dll或實例無法執行的原因根據需要進行初始化。

也可能是因爲缺少某個數據文件或註冊表項,而這些數據文件或註冊表項在某些時候以不正確的方式使用。例如,代碼可能會假定數據文件存在,從它讀取的數據構建指針,並且由於文件不可用而無法正常工作,因此它讀入的緩衝區從未實際初始化。簡而言之,要解決這個問題,如果它不是動態依賴關係掃描程序可以提供幫助的依賴性場景,則可能需要調試有問題的代碼。您可以嘗試使用Process Monitor等工具,並在崩潰發生前不久查找涉及應用程序的錯誤。如果你有源代碼和符號,你可以嘗試運行WinDbg下的程序來弄清究竟是什麼崩潰,然後試圖弄清楚爲什麼它在一個環境中這樣做,而不是另一個。但是根據你已經提供的信息,沒有人可以告訴你答案。

+0

非常感謝每個人的時間和回答/評論:這與InstallShield無關(它只是「另一臺計算機上的數據有問題,還有一個未捕獲的異常......)我太專注於InstallShield了! – Melanie