我刚才遇到了同样的问题,但幸运的是我可以访问另一个更旧的安装。
这是VS 2017 15.4.4下的命令行:
/iid "RtdHandleServer_i.c" /env win32 /h "RtdHandleServer.h" /W1 /char signed /tlb "Win32\Release\RtdHandleServer.tlb" /Oicf /D "NDEBUG" /no_robust /nologo /proxy "RtdHandleServer_p.c"
这是在 VS 2017 15.5.1 下更改为的内容:
/iid "RtdHandleServer_i.c" /env win32 /h "RtdHandleServer.h" /W1 /char signed /tlb "Win32\Release\RtdHandleServer.tlb" /Oicf /target "NT60" /D "NDEBUG" /no_robust /nologo /proxy "RtdHandleServer_p.c"
所以所有改变的是添加了一个新参数/target "NT60",大概是作为一个新的默认值。
在我看来,好像有两种方法可以解决这个问题:
- 在 idl 文件的 Property Pages 对话框中,转到 Configuration Properties > MIDL > Advanced,然后清除“Minimum Target System”的值。
- 摆脱 -no_robust 标志。根据文档(https://msdn.microsoft.com/en-us/library/windows/desktop/aa367349%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396):
“如果生成的存根需要在 Microsoft Windows NT、Windows 95/98 或 Windows Me 上运行,则必须使用 /no_robust 命令行开关来禁用 /robust 功能。”
就消除错误而言,任何一种更改都对我有用,但第一种方法的影响最小。
PS。我认为 MS 错误描述(https://msdn.microsoft.com/en-us/library/windows/desktop/aa366756%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396)可能在这种情况下是不正确的。您看到的原始错误消息是指两个特定标志/no_robust和/target,而不是/osf和/ms_ext。
注意: MIDL 编译器/robust
开关执行以下操作(Microsoft 文档 MIDL 编译器:/robust 开关)
使用该/robust
开关会生成额外的信息,允许网络数据表示 (NDR) 引擎对动态数组、联合和 DCOM 应用程序中的 in out 接口指针中的相关参数执行运行时错误检查。/robust 开关仅在 Windows 2000 和更高版本的 Windows 下可用。