2010-07-31 20 views
3

我正在使用包含大量HTML資源的Visual Studio C++項目。他們通過一個看起來像這樣的方法加載:爲什麼LoadResource/LockResource有時會返回連接的資源數據?

LPCTSTR loadHTML(HMODULE hModule, LPCTSTR sResourceName) 
{ 
    HRSRC hResource = FindResource(hModule, sResourceName, RT_HTML); 
    if(!hResource) 
     return 0; 

    HGLOBAL hResourceData = LoadResource(hModule, hResource); 
    if(!hResourceData) 
     return 0; 

    return reinterpret_cast<LPCTSTR>(LockResource(hResourceData)); 
} 

大多數情況下,這工作正常。但是,有些時候,它會返回與另一個資源連接的資源。發生這種情況時,這是構建中的一個長期問題。我可以通過向有問題的資源添加幾行空白行然後重新構建項目來「修復」它。它會定期發生,即使資源沒有改變。

我很想深入瞭解它發生的原因。有其他人遇到它嗎?我的資源能否引起問題?我的代碼錯了嗎?

不幸的是,我不願在此發佈示例資源;他們很長,這是專有軟件。

+0

而不是觸摸資源文件,你可以'解決'它通過做一個完整的解決方案重建(清潔+生成)?我不知道這是VS緩存問題。 – Tergiver 2010-07-31 12:15:46

+0

@Tergiver:當遇到問題時,我還沒有嘗試完全重建,主要是因爲該項目需要永遠從頭開始構建。但是,爲了科學的利益,我會在下次發生的時候踢出一個。 – 2010-07-31 12:37:44

回答

6

什麼是你的資源特有的是你期待他們被零終止。 iirc資源部分在16字節邊界上對齊,這意味着只要「blob」是16字節長的倍數,資源和下一個資源之間就不會有任何分隔字節。

要麼確保資源被保存爲終止零字符,要麼使用SizeofResource來確定資源的結束位置。

3

你如何確定一個資源的結束?你的資源文件以(unicode的雙倍)NULL結尾嗎?我不認爲有任何保證資源在PE文件中被終止,你似乎將它視爲一個字符串。

+0

謝謝,現在看來很明顯,詛咒我的假設。我贊成你,但我接受克里斯的提及'SizeofResource'的答案,其中我沒有意識到。 – 2010-07-31 12:50:50

相關問題