2012-03-09 36 views
1

任何人都可以提供解釋或鏈接,解釋MFC資源文件中的STRINGTABLE是如何定義的,並且可以手動擴展?MFC - 手動擴展字符串表

我試圖做到這一點,但未能在多項目解決方案中這樣做。上述解決方案中的大多數項目都有自己的資源文件並重命名爲resource.h-files。

當應用程序嘗試訪問字符串資源時,顯示錯誤消息'找不到'22392'的資源字符串'。 22392是我嘗試創建的字符串的ID。 如果我使用已定義的字符串ID,則不會收到類似的錯誤消息。

使用Visual Studio 2010的嚮導來添加字符串資源也不起作用。 但它在資源符號列表和字符串表編輯器中正確顯示。

不用說,我沒有參與創建這個解決方案。

感謝您的幫助。

[EDIT1]

我通過使用值執行「查找文件」和使用其他值以及排除衝突的可能性:22390,22391,22393,22394,22395.總是有相同的結果。

[EDIT2]

我重複我在一個項目一個新的,乾淨和簡單的MFC應用程序的複雜的解決方案做的步驟,它的工作沒有問題。因此,我認爲我的問題與解決方案有多個項目和資源有關。

的步驟有以下幾條:

  1. 選擇在RESOURCE.H一個免費電話號碼(這是在我的情況不同的命名),增加的#define IDS_XXX 免費電話
  2. 通過執行「查找文件」來驗證所選號碼。
  3. 在resource.h中向STRINGTABLE添加一行,最好靠近IDS_,其值接近我選擇的行。

    STRINGTABLE 
    BEGIN 
        IDS_OTHER   "I have a number close to XXX" 
        IDS_XXX   "HelloHello" 
    END 
    
  4. 訪問在該應用程序的字符串:

    CString strMyString; 
    strMyString.LoadString(IDS_XXX); 
    AfxMessageBox(strMyString, MB_YESNO | MB_ICONEXCLAMATION); 
    

[EDIT3]

我試圖找到加載鏈的,導致該錯誤消息的呼叫。 無法加載字符串資源的LoadString位於類中,該類與包含所述字符串資源的資源文件(.rc)位於同一項目中。在那裏生成錯誤消息'找不到'22392'的資源字符串'。這至少解釋了爲什麼我找不到任何東西。

[EDIT4]

我能原因的進一步隔離。

在cstringt.h HINST是NULL又名串的ressource無法找到:

_Check_return_ BOOL LoadString(_In_ UINT nID) 
{ 
    HINSTANCE hInst = StringTraits::FindStringResourceInstance(nID); 
    if(hInst == NULL) 
    { 
     return(FALSE); // goes here, but shouldn't, hInst == NULL 
    } 
    return(LoadString(hInst, nID)); 
} 

這是奇怪的,因爲它可以在同一資源文件就好內訪問另一個字符串的ressource。

+0

有些選項可以啓動資源的編號,並且我之前用它們來處理一組MFC擴展DLL。我認爲這些是在選項/資源...對不起,我現在沒有MSVC MFC可用... – CapelliC 2012-03-09 11:32:05

+0

@chac:如果你建議改變現有的資源編號,這是不容置疑的,因爲這個解決方案已經發展了十多年了,如果我嘗試過這樣的事情,所有地獄都會崩潰。 – 2012-03-09 11:40:46

回答

1

未找到「22392的資源字符串」錯誤聽起來像Windows無法在字符串表中找到該特定字符串,雖然這與您的語句衝突「,但它顯示正確地在資源符號列表中和字符串表格編輯器中「。我會做一些事情或檢查以縮小問題的範圍:

  • 清理/重建整個項目和或解決方案。我從VS看到了太多奇怪的行爲,只是由於糟糕或過時的構建,這通常是我嘗試的第一件事。
  • 在文本編輯器中編輯RC文件:右鍵單擊VS2010中的RC文件和「查看代碼」。確認字符串22392確實存在且有效。檢查它之前和之後的條目。
  • 從字符串表和resource.h中刪除字符串。從資源編輯器重新創建字符串。
  • 您提到「重命名的resource.h文件」。我不完全確定你的意思,但要確保它們在RC文件中正確使用:在文本編輯器中查看它們時,它們應該包含在頂部。
  • 確保22392的定義名稱未在項目的其他位置重新定義。

如果字符串存在於字符串表中,並且仍然出現「未找到」錯誤,那麼其他事情正在進行。

+0

重建,花了一個小時,伎倆。謝謝,你救了我很多麻煩。 – 2012-03-09 14:29:43

+2

很高興工作。我以前的版本從來沒有遇到過問題,但VS2010經常會混淆構建,並且無法正確檢測文件更改後要重建的文件。我不知道究竟是怎麼發生的,爲什麼會發生這種情況,但是現在當我看到「奇怪」的錯誤時,我的第一步就是徹底重建。這吸引了大型項目,但我寧願花一個小時讓計算機重建一個小時,試圖追蹤一個不存在的錯誤。 – uesp 2012-03-09 15:38:51

0

ID的定義存在於Resource.h中。可能有人可能已經添加了一個字符串並刪除了Resource.h中的條目,這就是爲什麼它向您顯示錯誤消息。打開resource.h並添加#define IDS_XXX 22392

+0

相應的Resource.h有另一個名稱,這就是我已經添加了我的#define IDS_XXX 22392的地方。如果我刪除這一行,解決方案將不會編譯:未聲明的標識符。所以編譯器注意到#define。 我猜這個程序在運行時使用我的自定義ID時有問題,這有什麼可能與此解決方案中多個項目和資源的使用有關? – 2012-03-09 10:48:13

+0

@red_rain:可能是因爲confilct。你能用22392 – Jeeva 2012-03-09 10:58:33

+0

以外的其他值來嘗試它嗎?我通過爲所使用的值執行「查找文件」並使用其他值來排除衝突的可能性:22390,22391,22393,22394,22395。總是得到相同的值結果。也請看看我對該問題的其他編輯。 – 2012-03-09 11:24:29