//typedef GUID IID; MIDL_INTERFACE(x) struct __declspec(uuid(x)) __declspec(novtable)

本文详细介绍了COM中IID的定义与实现方式,并深入探讨了IUnknown接口的具体实现细节,包括QueryInterface、AddRef及Release等核心方法的定义。

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

//////////////////////////////////////////////////////////////////
// IID_IUnknown and all other system IIDs are provided in UUID.LIB
// Link that library in with your proxies, clients and servers
//////////////////////////////////////////////////////////////////
/*
typedef struct _GUID {          // size is 16
DWORD Data1;
WORD   Data2;
WORD   Data3;
BYTE  Data4[8];
} GUID;
*/
//typedef GUID IID;
EXTERN_C const IID IID_IUnknown;

#if defined(__cplusplus) && !defined(CINTERFACE)

#if (_MSC_VER >= 1200)	// VC6 or greater
extern "C++"
{
#endif
//#define MIDL_INTERFACE(x)   struct __declspec(uuid(x)) __declspec(novtable)
    MIDL_INTERFACE("00000000-0000-0000-C000-000000000046")
	IUnknown
    {
    public:
        BEGIN_INTERFACE
        virtual HRESULT STDMETHODCALLTYPE QueryInterface( 
            /* [in] */ REFIID riid,
            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject) = 0;
        
        virtual ULONG STDMETHODCALLTYPE AddRef( void) = 0;
        
        virtual ULONG STDMETHODCALLTYPE Release( void) = 0;

#if (_MSC_VER >= 1200)	// VC6 or greater
		template <class Q>
		HRESULT STDMETHODCALLTYPE QueryInterface(Q** pp)
		{
			return QueryInterface(__uuidof(Q), (void**)pp);
		}
#endif    

        END_INTERFACE
    };

为了定义蓝牙设备的发射功率为高中低三个档位,我们可以创建一个枚举类型 `E_BLE_TX_POWER_LEVEL`。该枚举将代表不同的功率级别,并且可以映射到实际的发射功率值(例如:低功率为 -20 dBm,中功率为 0 dBm,高功率为 +7 dBm)。 ### 定义枚举 ```c /* 发射功率级别枚举 */ typedef enum { BLE_TX_POWER_LOW = -20, /* 低功率: -20 dBm */ BLE_TX_POWER_MEDIUM = 0, /* 中功率: 0 dBm */ BLE_TX_POWER_HIGH = 7 /* 高功率: +7 dBm */ } E_BLE_TX_POWER_LEVEL; ``` ### 在结构体中使用该枚举 接下来我们更新你的蓝牙管理配置结构体,在其中使用这个新定义的枚举: ```c /*蓝牙管理配置数据结构定义*/ typedef struct { int SeqNumber; /* 序号:[1,65535]:从1开始:::true:false:*/ E_BLE_MODE_TYPE master_slave_select; /*蓝牙工作模式选择::::BLE_MODE_TYPE_SLAVE:false:true*/ bool_t device_info_uuid_enable; /*设备信息服务使能::::false:true:true*/ bool_t ut_spp_uuid_enable; /*对端设备是否带有公司spp服务::::false:true:true*/ E_BLE_TX_POWER_LEVEL tx_power_level; /* 设备发射功率级别::::BLE_TX_POWER_MEDIUM:false:true */ } S_BLE_CONFIG; ``` ### 使用示例 下面是一个使用示例,展示如何设置和使用这个结构体: ```c #include <stdio.h> #include <stdbool.h> typedef enum { BLE_MODE_TYPE_SLAVE = 0, /* 从机模式 */ BLE_MODE_TYPE_MULTI = 1 /* 主从一体模式 */ } E_BLE_MODE_TYPE; typedef enum { BLE_TX_POWER_LOW = -20, /* 低功率: -20 dBm */ BLE_TX_POWER_MEDIUM = 0, /* 中功率: 0 dBm */ BLE_TX_POWER_HIGH = 7 /* 高功率: +7 dBm */ } E_BLE_TX_POWER_LEVEL; typedef int bool_t; #define TRUE 1 #define FALSE 0 /*蓝牙管理配置数据结构定义*/ typedef struct { int SeqNumber; /* 序号:[1,65535]:从1开始:::true:false:*/ E_BLE_MODE_TYPE master_slave_select; /*蓝牙工作模式选择::::BLE_MODE_TYPE_SLAVE:false:true*/ bool_t device_info_uuid_enable; /*设备信息服务使能::::false:true:true*/ bool_t ut_spp_uuid_enable; /*对端设备是否带有公司spp服务::::false:true:true*/ E_BLE_TX_POWER_LEVEL tx_power_level; /* 设备发射功率级别::::BLE_TX_POWER_MEDIUM:false:true */ } S_BLE_CONFIG; int main() { S_BLE_CONFIG ble_config = { .SeqNumber = 123, .master_slave_select = BLE_MODE_TYPE_SLAVE, .device_info_uuid_enable = TRUE, .ut_spp_uuid_enable = FALSE, .tx_power_level = BLE_TX_POWER_HIGH }; printf("Sequence Number: %d\n", ble_config.SeqNumber); printf("Mode: %s\n", (ble_config.master_slave_select == BLE_MODE_TYPE_SLAVE) ? "Slave" : "Multi"); printf("Device Info UUID Enabled: %s\n", ble_config.device_info_uuid_enable ? "Yes" : "No"); printf("SPP UUID Enabled: %s\n", ble_config.ut_spp_uuid_enable ? "Yes" : "No"); printf("Transmit Power Level: %d dBm\n", ble_config.tx_power_level); return 0; } ``` ### 解释 - **E_BLE_TX_POWER_LEVEL** 是一个枚举类型,用于表示蓝牙设备的发射功率级别。 - 枚举中的每个值对应一个具体的发射功率(dBm),分别是 `-20`、`0` 和 `+7`。 - 在结构体 `S_BLE_CONFIG` 中添加了 `tx_power_level` 字段,使得配置信息更加清晰直观。 - 示例程序演示了如何初始化结构体并访问其成员变量,包括打印当前配置。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值