error C4772: #import 引用了缺少的类型库中的类型;“__missing_type__”用作占位符 解决办法

来源:互联网 发布:mysql safe error 编辑:程序博客网 时间:2024/06/08 03:53

用#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__错误,再使用上面的办法

阅读全文
0 0
原创粉丝点击