一个关于在IDL文件中union结构体的问题,真是搞不懂,为什么微软可以我不可以!

Snow_1980 2008-05-11 12:43:07
在微软的DIRECTX的SDK文档中可以查看到三维矩阵结构体D3DMMATRIX,定义如下:
typedef 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;
DIRECTX很多借口都用到了这个结构体做参数

我建立了一个ATL工程,在IDL文件中加入了D3DMMATRIX的定义,并在接口中使用D3DMMATRIX结构体作为参数传递,结构编译出错:
.\adsf.idl(35) : error MIDL2143 : parameter must not derive from a non-rpcable union : [( Parameter 'pVal' ) ]
.\adsf.idl(35) : error MIDL2161 : union has at least one arm without a case label : [ Field ( Parameter 'pVal' ) ]
.\adsf.idl(35) : error MIDL2161 : union has at least one arm without a case label : [ Field 'm' ( Parameter 'pVal' ) ]
.\adsf.idl(36) : error MIDL2143 : parameter must not derive from a non-rpcable union : [( Parameter 'newVal' ) ]
.\adsf.idl(36) : error MIDL2161 : union has at least one arm without a case label : [ Field ( Parameter 'newVal' ) ]
.\adsf.idl(36) : error MIDL2161 : union has at least one arm without a case label : [ Field 'm' ( Parameter 'newVal' ) ]

报错的意思就是因为在结构体中使用了union,好像是要求我对D3DMMATRIX添加swith_is或swith_type属性,那样的话又必须在D3DMMATRIX中再添加一个新的参数,就改变了D3DMMATRIX的定义!

所以真是很搞不懂,不知道微软的DIRECTX是如何解决这个问题的,不知那位高手知道如何解决,请指点我一下,不胜感激!!百分相赠!
...全文
356 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
healer_kx 2008-05-11
  • 打赏
  • 举报
回复
高深,看不懂。
Kudeet 2008-05-11
  • 打赏
  • 举报
回复

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;
Snow_1980 2008-05-11
  • 打赏
  • 举报
回复
谢谢各位的解答,不过好像还是没有解决这个问题……

首先加public属性的意思是即使接口没用用到IDL中定义的结构,也将其导出至tlb中(我是这样理解的,不知对不对)

现在编译的错误好像就是无法识别其中的union,按照4楼的意思就是要加一个标志符对union进行标志,但是DIRECTX中很多接口就是传递的D3DMMATRIX指针对性,其中并无标志参数,例如下面这个接口就无

HRESULT SetTransform(
D3DMTRANSFORMSTATETYPE State,
CONST D3DMMATRIX* pMatrix,
D3DMFORMAT Format
);

搞不懂,明天看看DIRECTX的SDK中有没有定义的IDL文件可以参考一下
yueyeli 2008-05-11
  • 打赏
  • 举报
回复
不会,帮忙顶起来
jameshooo 2008-05-11
  • 打赏
  • 举报
回复 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++语言调用者来说是没有任何意义的
代码转载自:https://pan.quark.cn/s/a4b39357ea24 LA 1010 逻辑分析仪被视作一种效能卓越的数字信号分析设备,其核心功能在于对数字通信协议,例如I²C,进行检测与解构。本资源将集阐述LA 1010的操作流程以及如何借助该设备对I²C协议的波形展开分析。 确保逻辑分析仪被正确地连接至目标系统是极为关键的环节。在运用LA 1010的过程,必须将分析仪的通道0与通道1分别对应连接至目标装置的SCL(时钟)与SDA(数据)线路。务必保证连接的稳固性且无任何干扰因素,以此确保数据采集的精确度。 随后,需要设定采样参数。采样频率对于能否成功捕捉到信号具有决定性的作用。针对I²C协议,通常选用的采样频率范围介于100kHz到400kHz之间,这一范围的选择取决于实际应用场景I²C总线的运行速度。然而,LA 1010所能达到的最高采样速率可能高达500MHz,因此需要根据具体需求进行相应的调整。此外,还必须精心挑选适配目标设备工作电压的电压等级,例如3.3V、5V或1.8V。 在软件操作层面,需要选取恰当的通道与协议种类,即I²C。一旦启动采样,逻辑分析仪便开始记录相关数据。软件界面通常会实时展示波形图,为观察与分析提供便利。 关于I²C协议波形的解读,我们可以遵循以下步骤: 1. 总线处于空闲状态时:SCL与SDA均维持在高电平位置,这表明总线当前未进行数据传输。 2. 传输起始信号:当SCL处于高电平期间,SDA线从高电平转换至低电平,此动作标志着数据传输的开始。 3. 地址、数据及应答的识别:在每一个SCL高电平脉冲的持续时间内,SDA线上的电平状态代表了数据位。地址与数据的传输均为双向过程,而读写标识则由SDA线上的电平来...
内容概要:本文介绍了一种基于有限元分析(FEA)获取的磁通链接图来构建高精度永磁同步电机(PMSM)数学模型的方法,并在Simulink环境实现仿真。该方法通过有限元软件提取电机在不同工况下的非线性磁通特性数据,建立精确的磁链-电流-转子位置映射关系,有效克服了传统线性模型在反映铁芯饱和、交叉耦合等非线性效应方面的局限性。所构建的模型能够更真实地模拟PMSM的实际电磁行为,适用于高性能控制算法(如矢量控制、直接转矩控制、模型预测控制等)的研发与验证,显著提升了控制系统在动态响应、效率优化和稳定性方面的仿真准确性。; 适合人群:具备电机控制理论基础、熟悉有限元分析与Simulink仿真的研究生、科研人员及从事电机设计与驱动系统开发的工程技术人员。; 使用场景及目标:①用于高精度永磁同步电机控制系统的设计、仿真与性能评估;②支持先进控制策略(如MPC、滑模控制、自适应控制)在非线性电机模型上的验证与优化;③为电机参数敏感性分析、能效优化、故障诊断与容错控制研究提供可靠的仿真平台; 阅读建议:建议读者结合ANSYS Maxwell、JMAG等有限元工具与Matlab/Simulink进行联合仿真,掌握从电磁场建模、数据提取、查表插值到控制系统集成的完整流程,并参考文模型架构与数据处理方法,逐步复现、验证并拓展适用于特定电机结构的高保真仿真模型。

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧