四、参数传递方向
在C语言的函数声明中,尤其当参数为指针的时候,你是看不出它传递方向的。比如:
void fun(char * p1, int * p2); 请问,p1、p2 哪个是入参?哪个是出参?甚或都是入参或都是出参?由于牵扯到内存分配和释放等问题,COM 需要明确标注参数方向。以后我们写程序,就类似下面的样子:
HRESULT Add([in] long n1, [in] long n2, [out] long *pnSum); // IDL文件(注2) STDMETHOD(Add)(/*[in]*/ long n1, /*[in]*/ long n2, /*[out]*/ long *pnSum); // .h文件如果参数是动态分配的内存指针,那么遵守如下的规定:
方向 | 申请人 | 释放人 | 提示 |
[in] | 调用者 | 调用者 | 组件接收指针后,不能重新分配内存 |
[out] | 组件 | 调用者 | 组件返回指针后,调用者“爱咋咋地”(注3) |
[in,out] | 调用者 | 调用者 | 组件可以重新分配内存 |