2010-11-20 105 views
3

那麼我試圖編譯一個我正在處理的小測試應用程序。更改代碼生成後用代碼255退出的特定代碼行

所以讓事情變得短而簡單:

當我設置從「多線程DLL」到「多線程」我的代碼生成擺脫一些依賴,下面的代碼行崩潰我的應用程序(其中它通常運行沒有任何瑕疵)

的崩潰發生時,我想很短的路徑轉換爲長路徑。作爲這樣的:

LPCSTR tmp = reinterpret_cast<LPCSTR>(getenv("Temp")); 
GetLongPathNameA(tmp,tempFolder,MAX_PATH); 

崩潰,特別是發生在第一個行:

LPCSTR tmp = reinterpret_cast<LPCSTR>(getenv("Temp")); 

所以任何想法在這裏爲什麼它當你切換的代碼生成模式突然停止工作?謝謝!

編輯:

經過一些代碼重寫,我設法找出它執行

getenv("Temp"); 

非常非常奇怪的透視時,因爲它在其他模式

+0

當您構建項目時是否有任何警告? – Dialecticus 2010-11-20 11:46:29

+0

不是沒有,它只是出於一些奇怪的原因代碼255退出 – zeta 2010-11-20 12:12:36

+1

爲什麼'reinterpret_cast'是必要的? 'getenv'的結果是'char *',它應該自動轉換爲'LPCSTR'(即const char *')。如果你在沒有演員的情況下得到了錯誤,他們可能值得注意。 – 2010-11-25 01:19:45

回答

0

嘗試工作特別崩潰重建項目。清理它,確保輸出文件夾中沒有任何內容,爲了好的措施,刪除.ncb,然後構建。

+0

nope,不起作用... – zeta 2010-11-20 11:54:09

1

確保所有項目(和這些項目中的所有文件)一直規定編制,並用同樣版本的運行時庫的鏈接,即多線程靜態,你的情況。如果混合這些選項,編譯和鏈接的程序將會有未定義的行爲。還要確保你編譯並鏈接到正確版本的外部庫(MFC等)。在某些情況下,您被限制使用特定版本的運行時間,例如如果您與.Net進行互操作,則必須使用多引導的dll版本。

0

你從運行時動態切換到靜態後指定libcmt.liblibcpmt.lib作爲連接設置的依賴?如果沒有,請嘗試。然後重建。

+0

libcmt.lib默認情況下已經鏈接,所以它似乎。 libpcmt.lib我設法手動鏈接,但它仍然崩潰 – zeta 2010-11-20 12:31:59

0

你不應該使用的reinterpret_cast,因爲它是由繼承了或從其他類inheritting對象。只需使用基本類型的static_cast或指向基本類型的指針即可。

+0

你確定你沒有考慮'dynamic_cast'? 'reinterpret_cast'與繼承無關。 – 2011-01-12 12:50:37

+0

@尼克邁爾:是的,我是。 – 2011-01-12 15:11:20

1

你應該訪問它之前檢查的getenv()的返回值:

LPCSTR tmp = getenv("Temp"); 
if(tmp != NULL) 
    // do something with tmp 

我的猜測是,你的程序無法讀取環境變量和訪問所產生的空指針會導致程序崩潰。

Microsoft建議)getenv_s的使用(而不是,這裏是他們的MSDN樣品稍加修改你的工作:

char *tmp; 
size_t requiredSize; 

getenv_s(&requiredSize, NULL, 0, "Temp"); 
tmp = (char *) malloc(requiredSize * sizeof(char)); 
if (tmp != NULL) 
{ 
    getenv_s(&requiredSize, tmp, requiredSize, "Temp"); 
    if(tmp != NULL) 
     // do something with tmp 

    free(tmp); 
} 

我個人建議切換到WinAPI的函數GetEnvironmentVariable()來代替,這會給你一個更詳細的錯誤信息(如果函數失敗,請使用GetLastError()),這可能會幫助您找到問題的根源(或者使用其中一種替代方法解決問題)。