用#import方式引入Word类型库时出现该问题,引入方式:
#import "..\\import\\OFFICE12\\MSO.DLL" rename_namespace("Office"),named_guids,exclude("Pages"),rename("RGB","MSORGB"),rename("IAccessible","MSIaccessible")
using namespace Office;
#import "..\\import\\VBA\VBA6\\VBE6EXT.olb" rename_namespace("VBE6")
using namespace VBE6;
#import "..\\import\\Office11\\MSWORD.OLB" rename_namespace("MSWORD"),rename("ExitWindows","WdExitWindows"),rename("FindText","WdFindText")
using namespace MSWORD;
问题分析:
错误定位在第三个#import,即引入 MSWORD.OLB 时,此错误是说,在生成类型库文件时(.tlh, .tli),使用了无效的类型,这个类型改用__missing_type__代替
问题解决:
1. 找到 tlh、thi的文件生成目录,一般是在Debug/Release目录下,打开 MSWORD.OLB 对应的tlh文件,在里面搜索__missing_type__,搜到的结果为:
// Method 'DocumentSync' not emitted because argument 'SyncEventType' has invalid type: __missing_type__
virtual HRESULT __stdcall raw_DocumentSync ( /*[in]*/ struct _Document * Doc, /*[in]*/ __missing_type__ SyncEventType ) = 0;
__declspec(implementation_key(5830)) HRESULT IApplicationEvents4::DocumentSync ( struct _Document * Doc, __missing_type__ SyncEventType );
。。。。。。
2. 从第一句可以看出,是 SyncEventType 无法识别
从网上搜 SyncEventType,大体判断这个应该是在 MSO.DLL 的类型库中定义的
3. 打开MSO.DLL 对应的 tlh 文件,在里面搜索SyncEventType ,搜到的结果为:
enum MsoSyncEventType;
enum MsoSyncEventType
{
msoSyncEventDownloadInitiated = 0,
msoSyncEventDownloadSucceeded = 1,
msoSyncEventDownloadFailed = 2,
msoSyncEventUploadInitiated = 3,
msoSyncEventUploadSucceeded = 4,
msoSyncEventUploadFailed = 5,
msoSyncEventDownloadNoChange = 6,
msoSyncEventOffline = 7
};
4. 看来应该就是这个了,MSO的类型库中声明的是MsoSyncEventType,而MSWORD.OLB 中引用的是不带Mso的,而SyncEventType有没在别处定义过
5. 根据上面的猜测,所以在生成MSO类型库时,将 MsoSyncEventType 强制改名为 SyncEventType,这样就可解决前面的报错问题了
改为:
#import "..\\import\\OFFICE12\\MSO.DLL" rename_namespace("Office"),named_guids,exclude("Pages"),rename("RGB","MSORGB"),rename("IAccessible","MSIaccessible"),rename("MsoSyncEventType","SyncEventType")
这种方法不一定靠谱,但我的项目中没有用到SyncEventType类型,也没有用到涉及该类型的方法,所以即使这么改有问题,对我的程序造成影响的可能性较小,
如果实在没法解决__missing_type__问题,可以考虑采用这种方式
附:可以先尝试删除自动生成的.tlh ,.tli文件,然后再重新编译,如果仍存在__missing_type__错误,再使用上面的办法