2012-03-21 87 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