当前位置: 代码迷 >> VC >> ATL中为啥不能使用MAKEINTRESOURCE函数
  详细解决方案

ATL中为啥不能使用MAKEINTRESOURCE函数

热度:6133   发布时间:2013-02-25 00:00:00.0
ATL中为什么不能使用MAKEINTRESOURCE函数
各位高手们,请教你们一个问题。希望大家能不吝赐教。
  我使用VS2008开发一个ATL程序。我事先加载了一个bmp资源在里面。其ID号为IDB_BITMAP,我想通过使用MAKEINTRESOURCE函数来加载这个bmp资源。编译时没有任何问题,但进入调试状态后,在监视窗口查看MAKEINTRESOURCE(IDB_BITMAP)时,显示说“CXX0017:错误:没有找到符号IDB_BITMAP”。在监视窗口查看MAKEINTRESOURCE(201)时,显示说“CXX0017:错误:没有找到符号“MAKEINTRESOURCE””。其中,201是IDB_BITMAP对应的值。
  请问各位,这是什么原因啊?

------解决方案--------------------------------------------------------
一,include <windows.h>
二,include "resouse.h"
------解决方案--------------------------------------------------------
不要去监视 MAKEINTRESOURCE(IDB_BITMAP)

这样的

LPTSTR str = MAKEINTRESOURCE(IDB_BITMAP);

监视 str的值试试

另外“我想通过使用MAKEINTRESOURCE函数来加载这个bmp资源”

这个怎么说?bmp资源是用LoadBitmap来加载的

The MAKEINTRESOURCE macro converts an integer value to a resource type compatible with the resource-management functions. This macro is used in place of a string containing the name of the resource.
------解决方案--------------------------------------------------------
#define MAKEINTRESOURCE(i) (LPTSTR) ((DWORD) ((WORD) (i)))


------解决方案--------------------------------------------------------
探讨
#define MAKEINTRESOURCE(i)  (LPTSTR) ((DWORD) ((WORD) (i)))



------解决方案--------------------------------------------------------
探讨
    我使用MAKEINTRESOURCE只是为了得到bmp资源的路径名而已。这样做是为了发布ATL生成的文件时,不用提供这个bmp图片。
    LPTSTR str =  MAKEINTRESOURCE(IDB_BITMAP);
    使用上面这句,监视str时,会显示错误的指针。

------解决方案--------------------------------------------------------
应该来说,你只要尝试一下 显示这个位图成功,表面这个资源被成功载入了。

MAKEINTRESOURCE(IDB_BITMAP);就上上面说的,做了一个强制转换。

http://www.diybl.com/course/3_program/vc/vc_js/200896/139278 这里有分析。

CString 通过高位和地位来判断,是一个字符串还是一个资源。
------解决方案--------------------------------------------------------


HBITMAP hbmBk = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP1));
BITMAP bwh;
::GetObject(hbmBk,sizeof(BITMAP),&bwh);
printf("%d",bwh.bmWidth);
printf("%d",bwh.bmHeight);

vs2005中测试通过
------解决方案--------------------------------------------------------
http://www.winehq.org/pipermail/wine-patches/2006-May/026377

上面这个网站有解释,大概是说
DDB的图必须为空,而DIB得图才返回正确的地址。