/Oi 和 /Oic 切换指示 MIDL 编译器使用完全解释的封送方法。 /Oicf 开关提供其他性能增强功能。
midl /{Oi | Oic | Oif | Oicf}
切换选项
-
Oi
-
指定用于封送客户端和服务器之间传递的存根代码的完全解释方法。
注释
此开关已过时。 建议在其位置使用 /Oicf 开关。
-
Oic
-
指定提供 /Oi 的所有功能的无代码代理方法,并进一步减小对象接口的客户端存根代码的大小。
注释
此开关已过时。 建议在其位置使用 /Oicf 开关。
-
Oif 或 Oicf
-
指定无代码代理封送方法,包括 /Oi 和 /Oic 提供的所有功能,但使用新的解释器(快速格式字符串)来提供比 /Oi 或 /Oic 更好的性能。 此开关包括最新的 RPC 增强功能,建议用于新式 RPC 方案。
注解
请注意与支持平台相关的限制。
MIDL 3.0 编译器提供两种方法用于封送代码:完全解释( /Oi、 /Oic 和 /Oicf)和混合模式( /Os)。 从 MIDL 版本 6.0.359 开始,MIDL 编译器默认生成 /Oicf/robust 存根。 某些模式不支持某些语言功能。 在这种情况下,编译器会自动切换到适当的模式并发出警告。
如果性能是个问题,混合模式 ( /Os) 方法可能是最佳方法。 在此模式下,编译器选择在生成的存根中内联封送某些参数。 虽然这会导致更大的存根大小,但它可提供更高的性能。
完全解释的方法完全脱机封送数据。 这大大减少了存根代码的大小,但会导致性能下降。 此外,对于完全解释的方法,每个过程有 16 个参数的限制。 任何包含超过 16 个参数的过程都将在 /Os 模式下自动处理。 在解释的模式中, /Oicf 提供最佳性能, /Oi 提供最佳的向后兼容性。
如果应用程序使用 MIDL 3.0 中引入的 MIDL 功能,例如 [wire_marshal] 和 [user_marshal] 属性,则可能需要使用 /Oif 选项。 如果应用程序使用 管道 ,则必须使用 /Oif 选项;如果指定另一种模式,MIDL 编译器将切换到 /Oif。
若要微调封送存根代码的方式,Microsoft RPC 提供 ACF [optimize] 属性。 此属性用作接口属性或操作属性,用于为单个接口或单个操作选择封送模式。
调用约定
使用 /Oi、 /Oic 或 /Oif 开关在解释方法中由 MIDL 编译器生成的存根必须在 C 编译过程中编译为 stdcall 或 cdecl 过程。 PASCAL 或 Fastcall 调用约定将不起作用。 此外,服务器存根必须编译为 stdcall。
示例
midl /Oi filename.idl
midl /Oic filename.idl
midl /Oif filename.idl
另见