2012-04-18 13 views
1

我試圖在沒有使用C++編程超過十年之後,向傳統的C++ Win32 DLL添加適當的錯誤報告。傳統C++ Win32 DLL中的空字符串終止 - 有更好的方法嗎?

這一直是空的工作令人難以置信的單調乏味的強制提醒在C/C++終止字符串 - 更不用說潛在的緩衝區溢出和安全問題。也許MFC CString的或STL庫 -

我使用了更先進的字符串庫考慮。

編輯

DLL被兩個舊版本我們的軟件 - 用C++編寫;和更新的版本 - 用C#編寫。

編譯器是VS2008。

對於第一遍,我正在登錄到標準Windows事件日誌,因爲將錯誤消息傳回到DLL客戶端將是一個很大的體系結構更改(當前體系結構非常糟糕,多個失敗模式被合併爲一個布爾型通過/失敗返回值,這個值一直傳遞迴調用堆棧。不用說,這會讓問題診斷出一場噩夢)。但我希望在稍後的日子提高這一點。

字符串庫問題

由於這是一個DLL,這甚至是一個好主意?

是否有任何特殊的DLL注意事項?

我應該知道的陷阱?

比其他用於此目的的一個圖書館更好?

空字符串問題

如果我堅持用空值終止的,其設定的字符串函數我應該使用? MS幫助文檔不鼓勵使用舊的C函數(例如strcat等)。但現在似乎有許多其他選項可用(例如_tcscat,_mbscat,wcscat等)。我應該使用哪個,爲什麼?

+0

你使用的是什麼版本的VC++編譯器?正如@Remy指出的那樣,錯誤報告如何以及在哪裏被消費是這裏最重要的問題。您是否考慮過像log4cpp這樣的現有基礎架構? – 2012-04-19 13:31:43

+0

@SteveTownsend - 請參閱我的編輯 – 2012-04-19 15:20:13

+0

我會看看log4cpp。有一個內置的Windows事件日誌appender,您可以稍後輕鬆轉換(或使用多個appender)。對於我來說,這是一個比您決定如何在現有代碼中處理char *更爲重要的決策。當需要讓客戶端應用程序直接使用日誌數據時,可以解決這個問題,並且在C++/C#客戶端中存在相關的編組問題。現在聽起來像是快速添加問題調試信息是優先考慮的。 – 2012-04-19 15:26:52

回答

3

從DLL共享任何種類的模板類都是危險的。由於模板位於頭文件中,因此您無法控制程序是否使用與DLL相同版本的頭文件 - 不匹配會導致致命錯誤。

至於_tcscat,_mbscat和wcscat之間的差別,你需要在你的API的字符集決定。_mb函數使用大多數過時的多字節字符集,並且wc函數使用wchar_t Unicode。根據您如何設置項目定義,_t函數將解析爲其中一個或另一個。

+0

感謝您的警告。我還發現了相關的問題「從DLL函數返回字符串」http://stackoverflow.com/q/4446620/102554關於這類問題的信息非常豐富。 – 2012-04-19 15:24:58

+0

WRT到_t函數,我必須確保DLL項目和客戶端項目的項目定義是相同的嗎? VS IDE中的這些項目設置在哪裏? – 2012-04-19 15:31:36

+0

@TomBushell,如果在DLL和客戶端的項目設置中出現不匹配的情況,您將會看到鏈接錯誤,因爲函數簽名也不會匹配。您可以在Configuration Properties.General.Character Set下找到該設置。 – 2012-04-19 16:02:32

1

如果您非常小心,可以使用std::string構造函數轉換任何傳入的內容,並將傳出的任何東西轉換爲str.c_str()

+0

你認爲std :: string是比MFC CString更好的選擇嗎?快速瀏覽相關問題會讓我相信更多的人使用std :: string。 – 2012-04-19 15:44:53

+0

@TomBushell,'std :: string'是標準的,我會在所有情況下使用它,除非有充分的理由不這樣做。或者,在這種情況下,對於Windows Unicode支持的'std :: wstring',它也是標準。 – 2012-04-19 16:06:05

+0

我剛剛發現我們的傳統C++ MFC客戶端使用CString,所以我在使用DLL時也有一點偏差 - 只是要保持一致。但共識似乎是在DLL邊界使用char *是最好的方法。 – 2012-04-19 17:56:24

3

這要看是什麼樣的錯誤的報告要添加,並報告是否只是DLL裏面,或者如果它越過邊界源DLL1到調用EXE。您可以使用任何想要的字符串類/庫在DLL的內部代碼中,但對於導出的DLL函數和回調的參數,您應該繼續使用以空字符結尾的字符指針來兼容多個編譯器和語言。

相關問題