2012-06-08 46 views
0

回答關於如何將const字符串數據存儲在可執行文件中的另一個問題出現問題:爲什麼運行時錯誤消息存儲在可執行文件中而不是由操作系統生成?爲什麼在可執行二進制文件中的一些錯誤消息

!This program cannot be run in DOS mode.
看起來合理,DOS不能期望檢測到更新的Windows應用程序並生成相應的錯誤消息。
- Attempt to use MSIL code from this assembly during native code initialization...etc..
如果我試圖調用:關於破壞時,你的程序是在它不能可靠地與OS功能

通信的狀態,但一些沒有意義也可能發生堆棧幀一些人。網絡程序集(我沒有 - 這是純粹的C++代碼).net或OS運行時肯定會管理自己生成錯誤消息。

而且文件系統錯誤消息也在exe中。當然,我希望在運行時由操作系統生成這些錯誤 - 如果應用程序在Windows的非英文版上運行,我是不是希望系統錯誤反映該語言,而不是我用來編譯它的語言?

就在週五下午的排序問題,但似乎並沒有被任何事情上Raymond Chen's site

+0

這個問題不是關於Windows,而是關於用於編譯/鏈接的工具鏈。也許添加一個VS相關的標籤,如果你正在使用Visual Studio ... – Anders

回答

1

我知道的例子是專門放置,因爲沒有用於OS或一些運行時產生錯誤的好辦法存根。而且,它們是實現的根本問題,而不是用戶應該看到的錯誤類型。

DOS是一個完美的例子。 DOS無法識別Windows程序併產生合理的錯誤,因此存根代碼包含在Windows程序中。

你的MSIL之一是非常相似。如果運行時未實際加載(因爲程序仍在初始化),運行時如何產生此錯誤?

另一個我能想到的例子是在C++程序中「純虛函數調用」。抽象基類vtables中充滿了發佈此消息的存根。我想他們可能是作爲操作系統調用產生相同的消息的存根,但這似乎是一件永遠不會發生的事情矯枉過正。

,如果你試圖從實際上沒有對浮點庫鏈接的本地C或C++程序調用到浮點庫有一個類似的問題。這本質上是語言運行時庫的浮點實現細節(與編譯器和鏈接器配合使用)。這不是一個操作系統級別的問題(從某種意義上說,「找不到文件」)。

0

它使您可以全球化您的應用程序。

E.g 伊萬可以在俄羅斯的錯誤信息,即使它在法國的操作系統上運行。

+0

但是,雖然我可以翻譯我的消息字符串,我不能改變編譯器提供的。因此,如果我使用由俄語編寫的應用程序,我會在俄語中得到「文件未找到」(或者如果它需要一個cyrilic字體,可能不會) –

+0

實際上,我似乎記得從MFC天可以打包語言特定的運行時與應用程序,但我認爲這隻適用於MFC的系統字符串表 –

+0

你可以提供你自己的我似乎記得,甚至多種語言。我記得在Delphi編譯win32應用程序很多月前。發展從來沒有發生過,我從來沒有接近過這樣的需要。 –

0

我猜這是由CRT引入的代碼,嘗試編譯一個測試應用程序,該應用程序不與default libraries鏈接並使用mainCRTstartup作爲入口點,則唯一的字符串應該是DOS存根中的錯誤消息。

相關問題