面向特定的 32 位或 64 位平台的存根

Microsoft RPC 和 MIDL 3.0 及更高版本的编译器的某些功能是特定于平台的。

MIDL 3.0 及更高版本的编译器会生成防护作为预防措施,方便在 C 编译阶段进行兼容性检查。 MIDL 生成两种类型的防护:依赖于平台的防护(32 位与 64 位)和依赖于版本的防护(功能集依赖)。 例如,MIDL 生成以下防护来防止对其他平台的 32 位存根进行 C 编译:

#if !defined(__RPC_WIN32__)
#error  Invalid build platform for this stub.
#endif

依赖于版本的防护由已处理的 IDL 文件中的一组功能和 /target 开关触发。 例如,如果接口使用仅在 Windows 2000 或更高版本上支持的功能,则 MIDL 会生成带有 TARGET_IS_NT50_OR_LATER 宏的防护。

Rpcndr.h 中定义的防护宏取决于 WINVER 和 _WIN32_WINNT 的设置,由 C/C++ 编译器进行评估。

如果在 C 编译时收到一条错误消息,指示你需要特定平台来运行存根,请首先进行检查,以确保你没有使用该平台上不可用的功能。 触发特定防护的功能在防护正文中列出。 在上一示例中,-Oicf 编译器开关触发了防护。 此类值得注意的功能包括 Windows 2000 及更高版本上提供的 /robust 开关和 [async] 属性,pipe 类型构造函数、/Oif 编译器选项以及 [user_marshal] 和 [wire_marshal]属性。 使用这些功能的存根将无法在早期系统上运行。

如果你知道目标平台对于正在使用的功能来说是正确的,但你仍然收到错误,你可能需要适当地设置环境变量。

针对 Windows 2000 或更高版本进行生成

  • 将此行添加到生成文件:

    CFLAGS = $(CFLAGS) -D_WIN32_WINNT=0x500
    

/target

/robust

async

async_uuid

/Oi

pipe

wire_marshal

user_marshal

封送 OLE 数据类型