我之前用VC6.0进行开发,添加库的时候,以下的往stdafx.h中添加方式是可以的:
#include <afxcmn.h> // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT
//以下是添加库的代码
#pragma warning(push)
#pragma warning(disable : 4192) /* Ignore warnings for types that are duplicated in win32 header files */
#pragma warning(disable : 4146) /* Ignore warnings for use of minus on unsigned types */
#import "\Program Files\ArcGIS\com\esriSystem.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids, exclude("OLE_COLOR", "OLE_HANDLE", "VARTYPE")
#import "\Program Files\ArcGIS\com\esriSystemUI.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#import "\Program Files\ArcGIS\com\esriGeometry.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#import "\Program Files\ArcGIS\com\esriDisplay.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#import "\Program Files\ArcGIS\com\esriOutput.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#import "\Program Files\ArcGIS\com\esriGeoDatabase.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#import "\Program Files\ArcGIS\com\esriCarto.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#import "\Program Files\ArcGIS\com\esriControls.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#pragma warning(pop)
但是要是把以上的代码直接在VC2005中的stdafx.h中添加的时候,编译是不能通过的。错误是有很多接口重定义。解决问题是,逐条添加库,添加一条就编译一次,看有没有重定义的接口或者其他变量,有则在import的exclude属性中将其排除。修改后,如下:
#pragma warning(push)
#pragma warning(disable : 4192) /* Ignore warnings for types that are duplicated in win32 header files */
#pragma warning(disable : 4146) /* Ignore warnings for use of minus on unsigned types */
#import "d:\Program Files\ArcGIS\com\esriSystem.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids, exclude("OLE_COLOR", "OLE_HANDLE", "VARTYPE")
#import "d:\Program Files\ArcGIS\com\esriSystemUI.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids, exclude ("ICommand", "IProgressDialog")
#import "d:\Program Files\ArcGIS\com\esriGeometry.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#import "d:\Program Files\ArcGIS\com\esriDisplay.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#import "d:\Program Files\ArcGIS\com\esriOutput.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#import "d:\Program Files\ArcGIS\com\esriGeoDatabase.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids, exclude ("IRow", "ICursor")
#import "d:\Program Files\ArcGIS\com\esriCarto.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids, exclude ("ITableDefinition", "UINT_PTR")
#import "d:\Program Files\ArcGIS\com\esriControls.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#pragma warning(pop)
用这样的添加库的方法一段时间后,又发现了问题。一些接口的方法在这种添加库的方法下,是没有的。如:IFeature类中的Store()方法,这种情况就没有。但是在第一种方法在VC6.0中的时候,那些方法是存在的。原因估计是我们在添加esriGeoDataBase库的时候排除了IRow类型,而IFeature是继承与IRow的,所以其中一些方法没有了。为了解决这个问题,就要给那些发生冲突的库重新定义命名空间,把no_namespace改为rename_namespace("newname")。修改后代码如下:
#pragma warning(push)
#pragma warning(disable : 4192) /* Ignore warnings for types that are duplicated in win32 header files */
#pragma warning(disable : 4146) /* Ignore warnings for use of minus on unsigned types */
#import "d:\Program Files\ArcGIS\com\esriSystem.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids, exclude("OLE_COLOR", "OLE_HANDLE", "VARTYPE")
#import "d:\Program Files\ArcGIS\com\esriSystemUI.olb" raw_interfaces_only, raw_native_types, rename_namespace ("esriSystemUI"), named_guids//, exclude ("ICommand", "IProgressDialog")
#import "d:\Program Files\ArcGIS\com\esriGeometry.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#import "d:\Program Files\ArcGIS\com\esriGeoDatabase.olb" raw_interfaces_only, raw_native_types, rename_namespace ("esriGeoDatabase"), named_guids//, exclude ("IRow", "ICursor")
#import "d:\Program Files\ArcGIS\com\esriDisplay.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#import "d:\Program Files\ArcGIS\com\esriOutput.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#import "d:\Program Files\ArcGIS\com\esriCarto.olb" raw_interfaces_only, raw_native_types, rename_namespace ("esriCarto"), named_guids, exclude (/*"ITableDefinition",*/ "UINT_PTR")
#import "d:\Program Files\ArcGIS\com\esriControls.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#pragma warning(pop)
但其中还是有些变量要排除的,如esriCarto中的UINT_PTR。这样之前没有的方法就找回来了。
至于为什么VC和VS中添加库有这么多的不同,我不了解。只能遇到问题试着解决问题,暂时以最后一种方法添加库还没有遇到别个问题,有问题再更新。
评论