如:
   BOOL GetA( void * p )
   {  //-- p已指向一个结构。
      //-- 指导结构成员类型为 int, char, double三个数据成员。
      //-- 这里怎么访问它们?(有可能吗?)
      return TRUE;
    }
谢谢!郁闷半天了!

解决方案 »

  1.   

    struct_type* po = (struct_type*)p;
    po->int
    po->char
    po->double
      

  2.   

    将p转换成结构的类型,在访问;
    (struct s*)p->
      

  3.   

    比如要取int数:
    int* ia=(int*)(p+int数的偏移字节数);
      

  4.   

    int t= static_cast<CTestView::YourStructType*>(p)->i;
      

  5.   

    不懂。进么强制转换不就得了吗

    static_cast<CRect *>(p)->Left不就行了
      

  6.   

    再把你的void 指针转换成结构指针不行吗?如果在你要访问数据的地方加入对此结构的声明(头文件)就可以了吧?不然你也可以自己定义一个一样的结构呀,反正你知道这个结构的构造.
    此外,可以根据结构变量的内存影像来直接读取各成员的地址.地址开始好象是一个虚指针,然后依次是成员, 但是在windows好象会以32BYTE为单位来自动对齐数据,所以这样做需要对各成员的存放地址搞清楚,如果是我我就试试,很好试出来的吧?
    还好,你这个类里没有复杂对象(象string什么的)倒不错,不然要用二次指针了.
      

  7.   

    不灵阿!首先,在运行时才确定结构的类型,我无法在运行时定义结构!
    其次,我用void * 时他总告诉我“非法的间接寻址”!
    用其它方法也行,只要能访问其中的成员就行!
      

  8.   

    通过成员的偏移量直接取值啊.
    int pi = *((int*)(pstruct + ioffset));
      

  9.   

    关键是偏移量是多少。
    还有,“非法的间接寻址”是什么意思呢?查查MSDN里的错误信息看看有什么有用的提示没有。
      

  10.   

    不用那么麻烦吧:
    key(中国程序员) 说的是最好的方法,也是最安全的方法,其他用首地址+offset的方法不仅麻烦(首先得计算offset值),而且不安全(万一 offset计算错误呢)
    另外: key(中国程序员) ,你是不是在非技术区发贴了,跟我一样,信誉值是97,有什么办法补回来吗?
      

  11.   

    MFC下以CObject为基类,可以用RUNTIME_CLASS宏得到CRuntimeClass结构,知道class name, 然后把指针相应地cast一下.所以这里的RunTime以及就符合你的要求了吧.
      

  12.   

    dynamic_cast 可以用来做向下cast,就象这里的从void* 到 structureA*
      

  13.   

    这里CRuntimeClass的IsKindOf和CreateObject或许有用,但这些东西MS方言有点太浓了.
      

  14.   

    使用强制类型转换。
    比如
    char data[]={0x10,0x11,0x12,0x13,0x14,0x15,0x16};
    void *p;
    你要取出data里的数。
    那你必须知道他的类型,

    int type[]={1,2,4};//1=char 2=short 4=long
    如下
    p=data;
    for(i=0;i<3;i++)
    {
     switch(type[i])
     {
       case 1:printf("Get %c\n",*(char *)p);p=(char*)p++; break;
       case 2:printf("Get %c\n",*(short *)p);p=(short*)p++ ;break;
       case 4:printf("Get %c\n",*(long *)p);p=(long*)p++ ;break;
     }}
      

  15.   

    呵呵,犯了个小错误,
    %c应该依次为 %c %d %ld