STDMETHOD_ 封装c接口示例
时间: 2023-12-19 09:07:24 浏览: 33
STDMETHOD_ 是 Microsoft COM 技术中的宏,用于定义 COM 接口中的方法。下面是一个使用 STDMETHOD_ 封装 C 接口的示例:
```c++
// 定义 C 接口
typedef struct MyInterface
{
int (*foo)(int);
int (*bar)(const char*);
} MyInterface;
// 定义 COM 接口
interface __declspec(uuid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")) IMyInterface : public IUnknown
{
STDMETHOD_(int, Foo)(int) PURE;
STDMETHOD_(int, Bar)(const char*) PURE;
};
// 封装 C 接口为 COM 接口
class MyInterfaceWrapper : public IMyInterface
{
public:
MyInterfaceWrapper(MyInterface* pInterface) : m_pInterface(pInterface) {}
// 实现 IUnknown 接口
STDMETHOD_(ULONG, AddRef)() { return 1; }
STDMETHOD_(ULONG, Release)() { return 1; }
STDMETHOD(QueryInterface)(REFIID riid, void** ppvObject)
{
if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IMyInterface))
{
*ppvObject = this;
AddRef();
return S_OK;
}
*ppvObject = NULL;
return E_NOINTERFACE;
}
// 实现 IMyInterface 接口
STDMETHOD_(int, Foo)(int n) { return m_pInterface->foo(n); }
STDMETHOD_(int, Bar)(const char* str) { return m_pInterface->bar(str); }
private:
MyInterface* m_pInterface;
};
```
使用示例:
```c++
// 创建 C 接口实例
MyInterface myInterface = { myFoo, myBar };
// 封装为 COM 接口
IMyInterface* pMyInterface = new MyInterfaceWrapper(&myInterface);
// 使用 COM 接口
int result1 = pMyInterface->Foo(42);
int result2 = pMyInterface->Bar("Hello, world!");
// 释放 COM 接口
pMyInterface->Release();
```
相关推荐
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![application/x-zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)