COM接口函数参数定义如果缺省[in][out]则默认为[in]
来源:互联网 发布:nginx 1.12.0 配置 编辑:程序博客网 时间:2024/05/18 03:09
最近遇见了一个很老的COM接口,函数参数声明竟然没有[in] [out]! 当时心里在暗骂这种代码当年怎么通过的code review!
改造这种接口,而同时又不能影响老的接口行为,必须弄清楚如果in out都没有,默认行为应该是什么样的,于是乎写了一个小程序,ATL Service, 然后在其接口定义中故意没加in out:
import "oaidl.idl";
import "ocidl.idl";
[
object,
uuid(0736591A-734E-4a3d-A1F0-E7D1112EA3AB),
helpstring("IMyTest Interface"),
pointer_default(unique)
]
interface IMyTest : IUnknown
{
HRESULT MyFun(
int iIndex,
BSTR bstrName,
IUnknown** ppIUnknown
);
};
[
uuid(5AA55643-DDC6-49E1-85CF-E7D1112EA3A9),
version(1.0),
]
library ATLProject1Lib
{
importlib("stdole2.tlb");
};
最后查看MIDL编译后生成的ATLProject1_p.c文件如下:
static const ATLProject1_MIDL_PROC_FORMAT_STRING ATLProject1__MIDL_ProcFormatString =
{
0,
{
/* Procedure MyFun */
0x33, /* FC_AUTO_HANDLE */
0x6c, /* Old Flags: object, Oi2 */
/* 2 */ NdrFcLong( 0x0 ), /* 0 */
/* 6 */ NdrFcShort( 0x3 ), /* 3 */
/* 8 */ NdrFcShort( 0x14 ), /* x86 Stack size/offset = 20 */
/* 10 */ NdrFcShort( 0x8 ), /* 8 */
/* 12 */ NdrFcShort( 0x8 ), /* 8 */
/* 14 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
0x4, /* 4 */
/* 16 */ 0x8, /* 8 */
0x5, /* Ext Flags: new corr desc, srv corr check, */
/* 18 */ NdrFcShort( 0x0 ), /* 0 */
/* 20 */ NdrFcShort( 0x1 ), /* 1 */
/* 22 */ NdrFcShort( 0x0 ), /* 0 */
/* Parameter iIndex */
/* 24 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
/* 26 */ NdrFcShort( 0x4 ), /* x86 Stack size/offset = 4 */
/* 28 */ 0x8, /* FC_LONG */
0x0, /* 0 */
/* Parameter bstrName */
/* 30 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */
/* 32 */ NdrFcShort( 0x8 ), /* x86 Stack size/offset = 8 */
/* 34 */ NdrFcShort( 0x1c ), /* Type Offset=28 */
/* Parameter ppIUnknown */
/* 36 */ NdrFcShort( 0x200b ), /* Flags: must size, must free, in, srv alloc size=8 */
/* 38 */ NdrFcShort( 0xc ), /* x86 Stack size/offset = 12 */
/* 40 */ NdrFcShort( 0x26 ), /* Type Offset=38 */
/* Return value */
/* 42 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
/* 44 */ NdrFcShort( 0x10 ), /* x86 Stack size/offset = 16 */
/* 46 */ 0x8, /* FC_LONG */
0x0, /* 0 */
0x0
}
};
可以看到所有参数类型都是默认为in(比如/* Flags: in, base type, */)!
- COM接口函数参数定义如果缺省[in][out]则默认为[in]
- Thinking in C++ -- 函数的缺省参数
- COM 参数有in, out ,retval.
- COM 参数有in, out ,retval
- 4、函数的[in][out]参数
- 创建存储过程,以部门编号为参数返回该部门的人数及平均工资(返回一个值可以通过函数来实现,但如果要返回多个值,需要使用out或in out模式参数实现)
- 存储过程简单示例1 默认为in OUT
- 虚函数继承的默认缺省参数
- Thinking in C++读书笔记--5.3缺省参数
- 【java学习笔记】 如果定义了带有参数的构造函数,则默认构造函数失效(需手动定义)
- 【swift】15-0529 In-Out参数 函数类型
- C++中WINAPI函数参数中的IN和OUT
- 设置COM接口默认参数
- Oracle 指定子程序 OUT 或 IN OUT 参数为引用传递
- in out in/out 三种参数的区别
- 过程参数有IN/OUT/IN OUT三种类型
- Oracle存储过程in、out、in out 模式参数
- Oracle存储过程in、out、in out 模式参数
- 笔记12--js基础知识
- NYOJ 喷水装置(二)
- Mac下面编译Android FFmpeg3.2.4
- fork函数的相关知识和使用
- websocket C# server
- COM接口函数参数定义如果缺省[in][out]则默认为[in]
- 大数运算
- orcale数据库-----------1
- jar文件解析,加载,卸载的简单实现
- 20170726(总结)
- 19+ JavaScript 常用的简写技巧
- 了解程序设计思维的相关案例
- C语言学生成绩管理系统
- HDU5968(65/600)