error LNK2001: unresolved external symbol _CLSID_
这个问题有多种可能,按顺序逐个说
1./mktyplib203 问题
在发布COM前编译MIDL时,如果没有用/mktyplib203选项,那么产生的.h中会是这样的
EXTERN_C const IID IID_IXX
而其实际定义是在xxx_i.c中
MIDL_DEFINE_GUID(IID, IID_IXX...);
可见如果此时只包含.h必然导致LNK2001.需要同时把_i.c编译进来。不过我一向使用/mktyplib203,所以.h中会是这样的
DEFINE_GUID(IID_IXXX,0xAxxx...);
那问题出在哪?
2.DEFINE_GUID 和INITGUID
其实看一下DEFINE_GUID的定义就明白了
#ifdef INITGUID
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
EXTERN_C const GUID DECLSPEC_SELECTANY name \
= { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }
#else
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
EXTERN_C const GUID FAR name
#endif // INITGUID
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
EXTERN_C const GUID DECLSPEC_SELECTANY name \
= { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }
#else
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
EXTERN_C const GUID FAR name
#endif // INITGUID
很明显,没定义INITGUID时 DEFINE_GUID并不是一个真正的定义(Definition)而是一个声明(Declaration).所以加上INITGUID定义就可以了
#include <initguid.h>
没有评论:
发表评论