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
>
同时应注意的是,增加#include <objbase.h>