[in][out][retval]

本文详细解析了COM自动化组件中[in], [out], [out, retval]参数的含义及使用场景,通过实例展示了如何在VC中生成包装类,特别强调了[out, retval]参数对返回类型的影响,使包装类更易于使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[in][out][retval]用于COM自动化组件,主要是用于生成包装类用的

[in]类型表明参数是一个输入参数,所以这个参数不会向外界返回结果
[out]类型表明参数是个输出参数,所以这个参数会向外界返回结果,参数类型只能是指针类型
[out,retval]类型表明参数是个输出参数, retval 必须与 out 联用,并且在参数类表中只有最后一个参数可以被指定为 [out,retval] 属性,包装类会用这个参数的类型作为包装类方法的返回值

我们举个例子
我们在 vc 中引入一个COM组件, vc 会分析 com 组件的类型库信息
假设有一个方法说明如下

[id(1), helpstring("method Foo")] HRESULT Foo([in] long lIn, [out] BSTR* bstrOut, [out,retval] BSTR* bstrResult);

那么vc生成的包装类的方法可能是

BSTR Foo(long lIn , BSTR& bstrOut);

我们看到,由于 bstrResult 具有 [out,retval] 属性,所以生成的包装类的方法返回值不再是 HRESULT类型,而是 BSTR 类型,这样,包装类就会更加易于使用
``` /** @file Library for Phytium platform. Copyright (C) 2020, Phytium Technology Co Ltd. All rights reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include <Library/ArmPlatformLib.h> #include <Library/DebugLib.h> #include <Library/IoLib.h> #include <Library/PcdLib.h> #include <Ppi/ArmMpCoreInfo.h> ARM_CORE_INFO mPhytiumMpCoreInfoTable[] = { { 0x0, 0x0, // Cluster 0, Core 0 // MP Core MailBox Set/Get/Clear Addresses and Clear Value (EFI_PHYSICAL_ADDRESS)0, (EFI_PHYSICAL_ADDRESS)0, (EFI_PHYSICAL_ADDRESS)0, (UINT64)0xFFFFFFFF } }; /* This function geted the current Boot Mode. This function returns the boot reason on the platform. @return Return the current Boot Mode of the platform. */ EFI_BOOT_MODE ArmPlatformGetBootMode ( VOID ) { return BOOT_WITH_FULL_CONFIGURATION; } /** Initialize controllers that must setup in the normal world. This function is called by the ArmPlatformPkg/Pei or ArmPlatformPkg/Pei/PlatformPeim in the PEI phase. @retval EFI_SUCCESS ArmPlatformInitialize() is executed successfully. **/ RETURN_STATUS ArmPlatformInitialize ( IN UINTN MpId ) { return RETURN_SUCCESS; } /** This function Inited the system (or sometimes called permanent) memory. This memory is generally represented by the DRAM. @param[in] None. @retval None. **/ VOID ArmPlatformInitializeSystemMemory ( VOID ) { // Nothing to do here } /** This function geted the information of core. @param[out] CoreCount The count of CoreInfoTable. @param[out] ArmCoreTable The pointer of CoreInfoTable. @retval EFI_SUCCESS PrePeiCoreGetMpCoreInfo() is executed successfully. **/ EFI_STATUS PrePeiCoreGetMpCoreInfo ( OUT UINTN *CoreCount, OUT ARM_CORE_INFO **ArmCoreTable ) { *CoreCount = PcdGet32 (PcdCoreCount); *ArmCoreTable = mPhytiumMpCoreInfoTable; return EFI_SUCCESS; } // // Needs to be declared in the file. Otherwise gArmMpCoreInfoPpiGuid is // undefined in the contect of PrePeiCore // EFI_GUID mArmMpCoreInfoPpiGuid = ARM_MP_CORE_INFO_PPI_GUID; ARM_MP_CORE_INFO_PPI mMpCoreInfoPpi = { PrePeiCoreGetMpCoreInfo }; EFI_PEI_PPI_DESCRIPTOR gPlatformPpiTable[] = { { EFI_PEI_PPI_DESCRIPTOR_PPI, &mArmMpCoreInfoPpiGuid, &mMpCoreInfoPpi } }; /** This function geted the information of Ppitable. @param[out] PpiListSize The size of Ppitable. @param[out] PpiList The pointer of Ppitable. @retval None. **/ VOID ArmPlatformGetPlatformPpiList ( OUT UINTN *PpiListSize, OUT EFI_PEI_PPI_DESCRIPTOR **PpiList ) { *PpiListSize = sizeof (gPlatformPpiTable); *PpiList = gPlatformPpiTable; }```分析一下
03-26
``` /** ****************************(C) COPYRIGHT 2016 DJI**************************** * @file pid.c/h * @brief pid实现函数,包括初始化,PID计算函数, * @note * @history * Version Date Author Modification * V1.0.0 Dec-26-2018 RM 1. 完成 * @verbatim ============================================================================== ============================================================================== @endverbatim ****************************(C) COPYRIGHT 2016 DJI**************************** */ #ifndef PID_H #define PID_H #include "sys.h" typedef float fp32; typedef double fp64; enum PID_MODE { PID_POSITION = 0, PID_DELTA }; typedef struct { //PID运算模式 uint8_t mode; //PID 三个基本参数 fp32 Kp; fp32 Ki; fp32 Kd; fp32 max_out; //PID最大输出 fp32 max_iout; //PID最大积分输出 fp32 set; //PID目标值 fp32 fdb; //PID当前值 fp32 out; //三项叠加输出 fp32 Pout; //比例项输出 fp32 Iout; //积分项输出 fp32 Dout; //微分项输出 //微分项最近三个值 0最新 1上一次 2上上次 fp32 Dbuf[3]; //误差项最近三个值 0最新 1上一次 2上上次 fp32 error[3]; } rho_pid_type_def; typedef struct { //PID运算模式 uint8_t mode; //PID 三个基本参数 fp32 Kp; fp32 Ki; fp32 Kd; fp32 max_out; //PID最大输出 fp32 max_iout; //PID最大积分输出 fp32 set; //PID目标值 fp32 fdb; //PID当前值 fp32 out; //三项叠加输出 fp32 Pout; //比例项输出 fp32 Iout; //积分项输出 fp32 Dout; //微分项输出 //微分项最近三个值 0最新 1上一次 2上上次 fp32 Dbuf[3]; //误差项最近三个值 0最新 1上一次 2上上次 fp32 error[3]; } theta_pid_type_def; /** * @brief pid struct data init * @param[out] pid: PID struct data point * @param[in] mode: PID_POSITION: normal pid * PID_DELTA: delta pid * @param[in] PID: 0: kp, 1: ki, 2:kd * @param[in] max_out: pid max out * @param[in] max_iout: pid max iout * @retval none */ /** * @brief pid struct data init * @param[out] pid: PID结构数据指针 * @param[in] mode: PID_POSITION:普通PID * PID_DELTA: 差分PID * @param[in] PID: 0: kp, 1: ki, 2:kd * @param[in] max_out: pid最大输出 * @param[in] max_iout: pid最大积分输出 * @retval none */ extern void rho_PID_init(rho_pid_type_def *pid, uint8_t mode, const fp32 PID[3], fp32 max_out, fp32 max_iout); extern void theta_PID_init(theta_pid_type_def *pid, uint8_t mode, const fp32 PID[3], fp32 max_out, fp32 max_iout); /** * @brief pid calculate * @param[out] pid: PID struct data point * @param[in] ref: feedback data * @param[in] set: set point * @retval pid out */ /** * @brief pid计算 * @param[out] pid: PID结构数据指针 * @param[in] ref: 反馈数据 * @param[in] set: 设定值 * @retval pid输出 */ extern fp32 rho_PID_calc(rho_pid_type_def *pid, fp32 ref, fp32 set); extern fp32 theta_PID_calc(theta_pid_type_def *pid, fp32 ref, fp32 set); /** * @brief pid out clear * @param[out] pid: PID struct data point * @retval none */ /** * @brief pid 输出清除 * @param[out] pid: PID结构数据指针 * @retval none */ //extern void PID_clear(pid_type_def *pid); int speed(int exspeed,int acspeed); #endif```分析
03-25
/** * @brief Clock sync transmit && receive data in polling mode. * @param [in] USARTx Pointer to USART instance register base * This parameter can be one of the following values: * @arg CM_USARTx: USART unit instance register base * @param [in] au8Buf The pointer to data transmitted buffer * @param [in] u32Len Amount of data to be transmitted. * @param [in] u32Timeout Timeout duration(Max value @ref USART_Max_Timeout) * @retval int32_t: * - LL_OK: No errors occurred. * - LL_ERR_TIMEOUT: Communicate timeout. * - LL_ERR_INVD_PARAM: u32Len value is 0 or the pointer au8Buf value is NULL. * @note Block checking flag if u32Timeout value is USART_MAX_TIMEOUT */ int32_t USART_ClockSync_Trans(CM_USART_TypeDef *USARTx, const uint8_t au8Buf[], uint32_t u32Len, uint32_t u32Timeout) { uint32_t i; int32_t i32Ret = LL_ERR_INVD_PARAM; DDL_ASSERT(IS_USART_UNIT(USARTx)); if ((NULL != au8Buf) && (u32Len > 0UL)) { for (i = 0UL; i < u32Len; i++) { /* Wait TX buffer empty. */ i32Ret = USART_WaitStatus(USARTx, USART_FLAG_TX_EMPTY, SET, u32Timeout); //等待发送缓冲区清空 if (LL_OK == i32Ret) { USART_WriteData(USARTx, au8Buf[i]); //发送缓冲区清空后 if (READ_REG32_BIT(USARTx->CR1, USART_RX) != 0UL) { //如果接收端使能 i32Ret = USART_WaitStatus(USARTx, USART_FLAG_RX_FULL, SET, u32Timeout); if (LL_OK == i32Ret) { (void)USART_ReadData(USARTx); } } } if (LL_OK != i32Ret) { break; } } if (LL_OK == i32Ret) { i32Ret = USART_WaitStatus(USARTx, USART_FLAG_TX_CPLT, SET, u32Timeout); } }
最新发布
07-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值