环境:cpu64,win7 64操作系统,vs2008,office2013,wps2013个人版
1.由于换了一个笔记本,xp->win7,office2010->2013,wps2012->2013,导致原来的代码不能用了
原始代码:
#import "lib/wps/2012.8.1.0.2998/kso10.dll" rename("RGB", "KsoRGB") rename("DocumentProperties","KsoDocumentProperties")
using namespace KSO;
#import "lib/wps/2012.8.1.0.2998/wpscore.dll" auto_search auto_rename no_auto_exclude
编译后:
1>e:\kqprint_new\kqprint_new\kqprint\wpsoper.h(7) : error C4772: #import 引用了缺少的类型库中的类型;“__missing_type__”用作占位符
1>e:\kqprint_new\kqprint_new\kqprint\debug\wpscore.tlh(1931) : error C2516: “__missing_type__”: 是非法基类
1> e:\program files (x86)\microsoft visual studio 9.0\vc\include\comdef.h(283) : 参见“__missing_type__”的声明
1>e:\kqprint_new\kqprint_new\kqprint\debug\wpscore.tlh(1931) : error C2146: 语法错误 : 缺少“,”(在标识符“ColorFormat”的前面)
1>e:\kqprint_new\kqprint_new\kqprint\debug\wpscore.tlh(1932) : error C2499: “WPS::ColorFormat”: 类不能是其自身的基类
1>e:\kqprint_new\kqprint_new\kqprint\debug\wpscore.tlh(1935) : error C2516: “__missing_type__”: 是非法基类
1> e:\program files (x86)\microsoft visual studio 9.0\vc\include\comdef.h(283) : 参见“__missing_type__”的声明
1>e:\kqprint_new\kqprint_new\kqprint\debug\wpscore.tlh(1935) : error C2146: 语法错误 : 缺少“,”(在标识符“FillFormat”的前面)
1>e:\kqprint_new\kqprint_new\kqprint\debug\wpscore.tlh(1936) : error C2499: “WPS::FillFormat”: 类不能是其自身的基类
........
2.百度:error C2516: “__missing_type__”: 是非法基类
参考http://bbs.wps.cn/forum.php?mod=viewthread&tid=22331586,换成
#import "D:\Program Files (x86)\Kingsoft\WPS Office\9.1.0.4715\office6\ksoapi.dll"
#import "D:\Program Files (x86)\Kingsoft\WPS Office\9.1.0.4715\office6\wpsapi.dll" rename_namespace("WPS")
编译后:
1>e:\hbj\test3\test0722\test0722\debug\wpsapi.tlh(22067) : warning C4003: “ExitWindows”宏的实参不足
1>e:\hbj\test3\test0722\test0722\debug\wpsapi.tlh(22067) : error C2059: 语法错误 : “常量”
1>e:\hbj\test3\test0722\test0722\debug\wpsapi.tlh(29762) : error C2146: 语法错误 : 缺少“;”(在标识符“VBE”的前面)
1>e:\hbj\test3\test0722\test0722\debug\wpsapi.tlh(29762) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>e:\hbj\test3\test0722\test0722\debug\wpsapi.tlh(29762) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>e:\hbj\test3\test0722\test0722\debug\wpsapi.tlh(29979) : error C2146: 语法错误 : 缺少“;”(在标识符“GetVBE”的前面)
1>e:\hbj\test3\test0722\test0722\debug\wpsapi.tlh(29979) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>e:\hbj\test3\test0722\test0722\debug\wpsapi.tlh(29979) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>e:\hbj\test3\test0722\test0722\debug\wpsapi.tlh(29979) : warning C4183: “GetVBE”: 缺少返回类型;假定为返回“int”的成员函数
........
3.百度,google:warning C4003: “ExitWindows”宏的实参不足
参考:http://bbs.csdn.net/topics/300159601
但是wps2013没有VBE6EXT.OLB,用vbeapi.dll代替
改成:
#import "D:\Program Files (x86)\Kingsoft\WPS Office\9.1.0.4715\office6\vbeapi.dll"
#import "D:\Program Files (x86)\Kingsoft\WPS Office\9.1.0.4715\office6\ksoapi.dll"
#import "D:\Program Files (x86)\Kingsoft\WPS Office\9.1.0.4715\office6\wpsapi.dll" rename_namespace("WPS")
编译后:
1>e:\hbj\test3\test0722\test0722\debug\vbeapi.tlh(632) : error C2146: 语法错误 : 缺少“;”(在标识符“CommandBars”的前面)
1>e:\hbj\test3\test0722\test0722\debug\vbeapi.tlh(632) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>e:\hbj\test3\test0722\test0722\debug\vbeapi.tlh(632) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>e:\hbj\test3\test0722\test0722\debug\vbeapi.tlh(653) : error C2146: 语法错误 : 缺少“;”(在标识符“GetCommandBars”的前面)
1>e:\hbj\test3\test0722\test0722\debug\vbeapi.tlh(653) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>e:\hbj\test3\test0722\test0722\debug\vbeapi.tlh(653) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>e:\hbj\test3\test0722\test0722\debug\vbeapi.tlh(653) : warning C4183: “GetCommandBars”: 缺少返回类型;假定为返回“int”的成员函数
1>e:\hbj\test3\test0722\test0722\debug\vbeapi.tli(244) : error C2143: 语法错误 : 缺少“;”(在“VBE::VBE::GetCommandBars”的前面)
1>e:\hbj\test3\test0722\test0722\debug\vbeapi.tli(244) : error C2433: “_CommandBarsPtr”: 不允许在数据声明中使用“inline”
1>e:\hbj\test3\test0722\test0722\debug\vbeapi.tli(244) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>e:\hbj\test3\test0722\test0722\debug\vbeapi.tli(244) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
.....
4.继续google:缺少“;”(在标识符“CommandBars”的前面)
但是没有什么结果了,于是心灰意冷,直接用
#import "D:\Program Files (x86)\Kingsoft\WPS Office\9.1.0.4715\office6\wpsapi.dll" auto_search auto_rename no_auto_exclude
结果编译通过
百度auto_search用法,
http://msdn.microsoft.com/zh-cn/subscriptions/downloads/0346ezww%28v=vs.90%29.aspx
http://technet.microsoft.com/zh-cn/library/298h7faa
auto_search 指定当使用 #import 引用了类型库,并且它本身引用了另一个类型库时,编译器可以为其他类型库执行隐式 #import。
原来造成上边的原因是wpsapi.dll引用了其他类库
// Cross-referenced type libraries:
//
// #import "D:\Program Files (x86)\Kingsoft\WPS Office\9.1.0.4715\office6\ksoapi.dll"
// #import "C:\Program Files (x86)\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB"
则另一种代码也可以编译通过:
#import "D:\Program Files (x86)\Kingsoft\WPS Office\9.1.0.4715\office6\ksoapi.dll"
#import "C:\Program Files (x86)\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB"
#import "D:\Program Files (x86)\Kingsoft\WPS Office\9.1.0.4715\office6\wpsapi.dll"/* auto_search,*/rename("ExitWindows","_ExitWindows")
总结:引用的类库可以通过wpsapi.thi文件查看,而auto_search居然可以自动查找类库,否则你就得自己指定了