2012-04-17 48 views
0

我已經動了我的琴絃資源,幸運的是我有LPCTSTR運算符實例的字符串方便,如:爲什麼我需要這個CString類型轉換?

CString str((LPCSTR) IDS_MY_STRING); 

現在我想做的事與MessageBox的相似類型轉換(),所以它從資源加載的字符串,以及使我這樣做:

MessageBox(hWnd, (LPCTSTR) IDS_MY_STRING ,"Error", MB_RETRYCANCEL); 

但是這不起作用,它編譯,但在運行時崩潰。現在做如下工作:

MessageBox(hWnd, (CString) (LPCTSTR) IDS_MY_STRING ,"Error", MB_RETRYCANCEL); 

我的問題是,的MessageBox()接受LPCTSTR作爲第二個參數反正那麼爲什麼我們必須從LPCTSTR另外類型強制轉換爲CString的,使這項工作?

回答

1

其他人已經解釋了類型轉換等的細節。

此外,爲了簡化代碼,您可能希望#define方便的宏是這樣的:

#define _S(id) (CString(LPCTSTR(id))) 

,然後用MessageBox使用(或其他LPCTSTR參數以及):

MessageBox(hWnd, _S(IDS_MY_STRING), _S(IDS_TITLE), MB_RETRYCANCEL); 
1

MessageBox沒有超載獲取資源ID,但您可以使用AfxMessageBox來代替。

+0

對,但在這種情況下我不能使用'AfxMessageBox'。 – zar 2012-04-17 21:06:04

3

您的IDS_MY_STRING不是真的指向字符串的指針。這是一個整數。 (如果它是一個字符串指針,你永遠不需要LPCTSTR強制轉換。)CString知道如何從整體資源ID加載資源字符串。

MessageBox不;它需要一個真實的字符指針,其中CString隱含地提供。

3

真正的問題(或者至少是答案的有趣部分)不太關於第二次失敗的原因,更多關於第一次失敗的原因。

第一個工程,因爲CString的構造函數採用LPCSTR實際上查看值,以確定它是否真的是指向字符串的指針或字符串資源的標識符。在後一種情況下,它會自動加載字符串資源並創建一個具有相同內容的CString。 IOW,你得到了一個從字符串標識符到CString的隱式轉換。

CString還支持隱式轉換爲LPCSTR/LPCSTR/LPCWSTR。

C++,但是,將只執行一個用戶定義的隱式轉換從被傳遞到需要用於表達任何類型的任何類型來獲得。在這種情況下,要從字符串ID獲得LPCTSTR,您需要從字符串ID到CString的兩個字符,以及另一個從CStringLPCTSTR。編譯器不會爲你自動完成。

因此,從字符串ID到LPCTSTR得到,你需要明確從字符串ID轉換爲CString,它採用CString的構造函數的LPCTSTR。因此,您將字符串ID轉換爲LPCTSTR,並將其從CString創建爲CString。然後編譯器會自動將CString轉換爲一個(真正的)LPCTSTR。

+0

你最後一段有點令人困惑。我想你想說的是我們仍然需要一個從'字符串ID'到'CString'的轉換。比CString有隱式轉換爲LPCTSTR。通過對'(CString)(LPCTSTR)'進行類型轉換,我們正在從ID到CString進行一次轉換。 – zar 2012-04-17 21:21:52

+0

編寫'CString(((LPCTSTR)IDS_MY_STRING)'而不是兩個明確的強制轉換是不是更具可讀性? – 2012-04-17 21:39:01

+0

@ChristianAmmer:是的,無論如何,我可能會那樣做。 – 2012-04-17 22:42:17

相關問題