CONTAINING_RECORD

MSDN描述:

CONTAINING_RECORD returns the base address of an instance of a structure given the type of the structure and the address of a field within the containing structure.

Syntax

PCHAR CONTAINING_RECORD(IN PCHAR Address, IN TYPE Type, 
IN PCHAR Field);

它的功能为已知结构体或类的某一成员、对象中该成员的地址和这一结构体名或类名,从而得到该对象的基地址。

其宏可以如此写:

#define CONTAINING_RECORD(address,type,field) \
((type*)((PCHAR)(address)-(ULONG_PTR)(&((type*)0)->field)))

实例:

#include <windows.h>  
#include <stdio.h>  

typedef struct
{
    int a;
    int b;
    int c;
    int d;
}DATA, *PDATA;

int main()
{
    DATA d = { 1, 2, 3, 4 };
    PDATA d2 = CONTAINING_RECORD(&d.b, DATA, b);
    printf("%d %d %d %d\n", d2->a, d2->b, d2->c, d2->d);  //Input:1 2 3 4

    int *d3 = (int*)(&((PDATA)0)->b);
    printf("%p\r\n", d3);  //Input:00000004 即b的相对地址
    ULONG_PTR Offset = (ULONG_PTR)d3;  //转成数字
    PDATA fin = (PDATA)((char*)(&d.b) - Offset);
    printf("%d %d %d %d\n", fin->a, fin->b, fin->c, fin->d);  //Input:1 2 3 4

    return 0;
}

猜你喜欢

转载自www.cnblogs.com/coolcpp/p/CONTAINING_RECORD.html
今日推荐