2014-03-24 64 views
0

當我的程序嘗試爲用戶生成AFX_IDP_PARSE_REAL錯誤時,它無法加載存儲在afxres.rc文件中的字符串。我發現已經有this question,但是它已經解決了,因爲對afxres.rc的引用被意外從program.rc文件中刪除了。對我來說並非如此。我的program.rc文件包含答案中列出的確切代碼,以包含afxres.rc文件。嘗試從afxres.rc加載字符串時MFC LoadString失敗

在調試模式下,它在下面的ASSERT中斷。

int AFXAPI AfxMessageBox(UINT nIDPrompt, UINT nType, UINT nIDHelp) 
{ 
CString string; 
if (!string.LoadString(nIDPrompt)) 
{ 
    TRACE(traceAppMsg, 0, "Error: failed to load message box prompt string 0x%04x.\n", nIDPrompt); 
    ASSERT(FALSE); 
} 
if (nIDHelp == (UINT)-1) 
nIDHelp = nIDPrompt; 
return AfxMessageBox(string, nType, nIDHelp); 
} 

當我實際運行通過.exe文件的應用,它只是產生一個空的警告框,因爲沒有加載AFX_IDP_PARSE_REAL串;這適用於afxres.rc中的任何字符串。

什麼可能導致應用程序無法從afxres.rc載入字符串?

+0

你有沒有走進加載鏈()檢查它試圖從正確的資源文件中加載字符串?你可能正在改變活動的資源句柄? – rrirower

+0

您是否嘗試過在VS中打開EXE的二進制資源,並查看AFX字符串資源是否確實嵌入正確? – user1793036

+0

@rrirower我多次進入LoadString調用。我已經研究過,但仍不確定如何確定正在訪問哪個資源文件。從一開始我一直擔心afxres.rc沒有被關注。我沒有確認如果我將AFX_IDP_PARSE_REAL定義複製到我的程序資源文件的字符串表中,LoadString()調用沒有問題。但我不確定這是否意味着它是唯一的資源文件被檢查或者它是否是其中的一個。 – Gregg1127

回答

0

只是讓你知道,通常包括afxres.rc文件是不夠的,你的頭文件包含在cpp/h文件中。你實際上需要包括兩次。如果您創建一個全新的MFC項目和(使用「查看代碼」選項),你會發現有一個正常檢查的RC文件的代碼包括:

///////////////////////////////////////////////////////////////////////////// 
// 
// Generated from the TEXTINCLUDE 2 resource. 
// 
#include "afxres.h" 

而且是RC內TEXTINCLUDE節文件:

2 TEXTINCLUDE 
BEGIN 
    "#include ""afxres.h""\r\n" 
    "\0" 
END 

你需要確保你在你的項目中做同樣的事情。或者,你可以使用一個「資源包括」嚮導,是通過對資源視圖右鍵點擊,允許通過對話框編輯兩部分可供選擇:

VC Resource Includes wizard

+0

感謝您的建議,但我的資源文件包含您提到的 include和 2 TEXTINCLUDE代碼部分。 – Gregg1127

相關問題