2012-03-21 63 views
1

我遇到了一個問題,當我傳遞它的MFC資源ID時,MAKEINTRESOURCE宏似乎總是返回一個錯誤的指針。資源ID全部列在Resource.h中,並且與資源屬性中ID的設置相匹配。MAKEINTRESOURCE返回資源ID的錯誤指針

我是MFC的新手,所以我不完全確定自己理解資源&他們的ID的工作,但在我看來,壞指針會表明我的資源沒有存儲在正確的位置在記憶中?這是一箇舊的項目,我試圖添加一些新的功能,並且當我嘗試使用較舊的資源做MAKEINTRESOURCE時,我檢查了anf(這肯定是工作的,它們在我運行應用程序時顯示並且功能正常),我也變得很糟糕指針。

這可能是什麼原因造成的?

編輯:該項目使用Unicode字符集爲好,如果讓如果「壞球」你的意思是「不指向資源在內存中對象的指針,」任何區別

+1

請具體說明「壞指針」的含義。 'MAKEINTRESOURCE'在指針內編碼一個整數。這不是一個你可以解除引用的指針;你可以用它做的唯一事情就是把它傳遞給一個資源函數。 – 2012-03-21 14:25:10

+0

當我在調試和鼠標上運行該程序的返回值時,它會說「 CXX0030Error:無法評估表達式」 這是預期的嗎?每當我嘗試使用來自MAKEINTRESOURCE的返回值加載資源時,它無法找到資源,我想也許是是原因。 – Marzipan 2012-03-21 14:34:08

+3

是的,這是預期的,因爲它不是一個指向任何東西的指針,也不能被取消引用。 – 2012-03-21 16:23:29

回答

2

,然後MAKEINTRESOURCE()工作正常。問題是,爲了使用相同的函數參數傳遞字符串或整數ID,Windows API函數會發出一個奇怪的指針轉換,該函數會將此函數檢測爲「哦,等待,這不是指針,它是一個資源ID 」。

這是記錄的行爲。例如,對於LoadBitmap()文檔中,它說:

lpBitmapName [in]:

A pointer to a null-terminated string that contains the name of the bitmap resource to be loaded. Alternatively, this parameter can consist of the resource identifier in the low-order word and zero in the high-order word. The MAKEINTRESOURCE macro can be used to create this value.

創建通過重新演繹的任意整數值是一個合法的C++構建,但取消引用無效的指針無效指針是未定義的行爲。

在這種情況下,接收參數的函數將檢查高位字是否爲0,如果是,則將低位字用作整數並且不要取消引用指針。

注:如果這種感覺就像一個討厭的黑客,這是因爲它是一個討厭黑客。

+0

因此,預計MAKEINTRESOURCE的回報值將是? 每當我嘗試加載資源(即m_ToolBar.LoadToolBar)時,它都會失敗,我認爲這可能是因爲。我加入了代碼,當它使用MAKEINTRESOURCE轉換後的資源ID搜索資源時,它無法找到它並且加載失敗。 – Marzipan 2012-03-21 14:37:11

+3

是的,由MAKEINTRESOURCE創建的值將在調試器中顯示爲「壞指針」。如果加載資源失敗,請按照文檔所述並調用['GetLastError()'](http://msdn.microsoft.com/zh-cn/)。com/en-us/library/windows/desktop/ms679360(v = vs.85).aspx)函數獲取錯誤代碼,然後在[system error codes]中查找此錯誤代碼(http://msdn.microsoft .com/en-us/library/windows/desktop/ms681381(v = vs.85).aspx)頁面知道這意味着什麼。 – 2012-03-21 14:45:27

+0

好的,謝謝 – Marzipan 2012-03-21 14:56:20