analytics

2010年8月8日星期日

error LNK2001: unresolved external symbol _CLSID_xxx

今天又有人问我一个古老的问题,使用我史前发布的COM时碰到
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

很明显,没定义INITGUID时 DEFINE_GUID并不是一个真正的定义(Definition)而是一个声明(Declaration).所以加上INITGUID定义就可以了


#include <initguid.h>

没有评论:

发表评论