我的问题可能很简单,但我一直想不明白:
MAKEINTRESOURCE宏将一个整型数强制类型转换成一个字符串指针,这个指针就真的指向一个字符串吗?
我看资源文件里的资源ID,每个整型数都是有序递增的,难道每个字符串的地址都恰好相差1?这不可能吧。
谁能帮我解释一下?谢谢!
// Load bitmap In
hBitmapIn = (HBITMAP)::LoadImage(hInstResource, MAKEINTRESOURCE(nBitmapIn), IMAGE_BITMAP, 0, 0, 0);
MAKEINTRESOURCE宏的定义:
#endif /* UNICODE */#define MAKEINTRESOURCEA(i) (LPSTR)((DWORD)((WORD)(i)))
#define MAKEINTRESOURCEW(i) (LPWSTR)((DWORD)((WORD)(i)))
#ifdef UNICODE
#define MAKEINTRESOURCE  MAKEINTRESOURCEW
#else
#define MAKEINTRESOURCE  MAKEINTRESOURCEA
#endif // !UNICODE

解决方案 »

  1.   

    资源ID都是2字节的整数,真正的字符串指针是4字节,所以系统会根据高16位是否为0来决定这个是字符串指针还是整型ID。
      

  2.   

    MAKEINTRESOURCE
    The MAKEINTRESOURCE macro converts an integer value to a resource type compatible with Win32 resource-management functions. This macro is used in place of a string containing the name of the resource. 
    不能把它和常规的字符串指针对应起来,这可能表明相关的资源管理器中只是把这个当作一个索引。
      

  3.   

    一些函数的参数要求给出资源名称或者资源ID,而参数定义的是指针类型,所以必须强制转换才能编译通过。函数内部可以通过参数的值来判断是指针还是ID,因为ID是用WORD来表示,肯定小于0x10000,而指针要大于0x400000,因为Windows应用程序的地址空间是从0x400000地址开始,所以不会有小于0x400000的指针。
      

  4.   

    不是啊!
    你所说的"我看资源文件里的资源ID,每个整型数都是有序递增的,难道每个字符串的地址都恰好相差1?这不可能吧" 
    资源ID 本身是 int 型,系统为其编号时,每个整形数都是有序递增很合理呀, 但是这并不说明,字符串的地址是有序递增的。如:
     char *V1 = 'a';
     char *V2 = 'b';你能确定  *VI - *V2    的值吗??
      

  5.   

    那为什么参数不直接指定为int型