正在修复COM接口重新定义错误

大家好,我叫Steven Toscano,我在Visual C++ IDE团队工作。  最近我们访问了一个客户,发现了一个常见的问题,人们在从旧版本的VS迁移到VS2005时会看到这个问题。

null

如果定义了一个与visualstudio2005vc++或platformsdk头中引入的接口同名的接口,则会遇到此问题。  根据您尝试升级的内容,有不同的方法来解决此问题。

在不接触现有客户机的情况下升级服务器

脚本:

您的服务器定义了一个接口,该接口与标准windows头拉入的接口冲突。  您的客户端依赖于此接口名称。  例如,假设您将接口命名为IContext,它将与平台SDK附带的ObjIdl.h中定义的接口冲突。  当你构建的时候,你会得到关于你的COM对象没有在IContext中实现足够的方法的错误,这是因为编译器首先从Platfom SDK头而不是你的头中获取接口。

解决方案1:

通常,引入这些重复名称的头文件位于stdafx.h文件中。  为了防止编译器从VS2005头中引入接口定义,请在stdafx.h的顶部插入以下代码:

#定义 __IContextu FWDu已定义__

#定义 __IContextu接口u已定义__

然后在stdafx.h文件的末尾插入以下代码:

#未定义 __IContextu FWDu已定义__

#未定义 __IContextu接口u已定义__

这是为了让编译器选择您的接口而忽略VS2005接口。  接口声明通常来自midl编译.IDL文件后生成的.h文件。

解决方案2:

如果运行midl时遇到类似以下情况的早期错误:

错误MIDL2003:重新定义:IContext

这意味着包含COM对象定义的IDL文件具有冲突的接口名称。  单凭上述解决方案是行不通的。  您需要重命名IDL文件中的冲突类型。  例如,假设名称为IContext,搜索IDL文件中IContext的所有实例并替换为IContext2。  然后在包含生成的.h文件的服务器实现代码中添加以下代码:

类型定义 IContext2 IContext;

#定义 IID U IContext IID U IContext2

这样,您就不需要更改任何服务器实现代码,旧客户端仍然可以使用IContext名称与您连接。  在成功构建之前,请添加上面解决方案1中描述的变通方法,这样就不会在IContext上出现与ObjIdl.h中的重新定义错误。  现在您应该能够成功地构建,并且老客户机应该能够连接到您(前提是您没有更改任何其他内容)。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享