typedef [public] struct _D3DMMATRIX { 
  union { 
    struct { 
      D3DMVALUE  _11, _12, _13, _14; 
      D3DMVALUE  _21, _22, _23, _24; 
      D3DMVALUE  _31, _32, _33, _34; 
      D3DMVALUE  _41, _42, _43, _44; 
    }; 
    D3DMVALUE m[4][4]; 
  }; 
} D3DMMATRIX; 

解决方案 »

  1.   

    idl中导出结构体的语法跟头文件是不一样的,首先要按照1楼说的添加public属性。按照你提供的编译错误提示,应该是结构中使用了NON-RPCABLE的成员变量,意思是这个变量类型无法被远程过程调用正确列集结构体,因为无法识别出union中的具体类型,按照下面的例子来定义:typedef [public, switch_type(short)] union _WILLIE_UNION_TYPE // switch_type(short)表示用于这个联合的指示符的类型是short类型

      [case(24)] float fMays; // 当联合指示符的值是24时,用fMays成员
      [case(25)] double dMcCovey; // 当联合指示符的值是25时,用dMcCovey成员
      [default] ; // 其它值是错误的,不对应任何成员
    } WILLIE_UNION_TYPE; 
     
    typedef [public] struct _WINNER_TYPE 

      [switch_is(sUniformNumber)] WILLIE_UNION_TYPE w; // 这个w就是一个union,当要使用w的值时,以sUniformNumber成员的值来确定使用联合中的哪个成员
      short sUniformNumber; // 这个就是联合指示符,它的值可以是24或者25
    } WINNER_TYPE;事实上,switch_type和switch_is属性仅仅用于数据的列集和散列,对于C/C++语言调用者来说是没有任何意义的
      

  2.   

    谢谢各位的解答,不过好像还是没有解决这个问题……首先加public属性的意思是即使接口没用用到IDL中定义的结构,也将其导出至tlb中(我是这样理解的,不知对不对)现在编译的错误好像就是无法识别其中的union,按照4楼的意思就是要加一个标志符对union进行标志,但是DIRECTX中很多接口就是传递的D3DMMATRIX指针对性,其中并无标志参数,例如下面这个接口就无HRESULT SetTransform(
      D3DMTRANSFORMSTATETYPE State,
      CONST D3DMMATRIX* pMatrix,
      D3DMFORMAT Format
    );搞不懂,明天看看DIRECTX的SDK中有没有定义的IDL文件可以参考一下