在dll中,我定义了IFace.h中包含了几个接口声明和IID的声明:
#include <iostream>
#include "objbase.h"
#include "unknwn.h"
using namespace std;
extern "C" 
{
extern const IID IID_IX;
    extern const IID IID_IY;
    extern const IID IID_IZ;
}extern "C" IUnknown* _stdcall CreateInstance();interface IX: IUnknown
{
virtual void _stdcall Fx()=0;
};interface IY: IUnknown
{
virtual void _stdcall Fy()=0;};interface IZ: IUnknown
{
virtual void _stdcall Fz()=0;
};
这份文件被dll与用户使用,
dll中Guid.cpp文件定义了IID:#include "stdafx.h"
#include "IFace.h"
// {8C0D4FB0-E6B9-47ec-8135-B67E6541F912}
extern "C"
{ extern const IID IID_IX={
0x8c0d4fb0, 0xe6b9, 
0x47ec,  0x81, 0x35, 0xb6, 0x7e, 0x65, 0x41, 0xf9, 0x12 
}; // {A2D7DFDF-E9E7-46cd-8A57-5EC3CC586807}
extern const IID IID_IY={
0xa2d7dfdf, 0xe9e7, 0x46cd, 
0x8a, 0x57, 0x5e, 0xc3, 0xcc, 0x58, 0x68, 0x7  }; // {C301B0CB-3AB8-42a3-8F3F-ABD9AF50A919}
extern const IID IID_IZ={
0xc301b0cb, 0x3ab8, 0x42a3,  
0x8f, 0x3f, 0xab, 0xd9, 0xaf, 0x50, 0xa9, 0x19 
};
};
dll的客户引用了#include "IFace.h"
为什么编译器报了这种错误:
正在链接...
Call.obj : error LNK2001: 无法解析的外部符号 _IID_IZ
Call.obj : error LNK2001: 无法解析的外部符号 _IID_IY
Call.obj : error LNK2001: 无法解析的外部符号 _IID_IX
D:\文档\程序\C++程序\COM+\ComDll\Debug\Call.exe : fatal error LNK1120: 3 个无法解析的外部命令

解决方案 »

  1.   

    要把Guid.cpp也添加到工程里。
      

  2.   

    动态链接COM的dll时,客户必须要有IID的定义代码吗?我感觉动态链接不需要出现定义的吧?这样客户与dll中的IID定义和声明文件完全可以各自为政,根本不需要加上extern "C",这个前缀好像是多余的吧?
      

  3.   

    终于知道怎么做了,可以在IFace.h文件中包含_declspec(selectany),那么IID的声明为:
    extern "C" __declspec(selectany) const IID IID_IX;
    extern "C" __declspec(selectany) const IID IID_IY;
    extern "C" __declspec(selectany) const IID IID_IZ;
    这样一来客户就不需要GUID.cpp文件,防止客户修改IID的值
      

  4.   

    晕,还是得用GetProcAddress,前面的方法不行
      

  5.   

    extern "C" IID IID_IX; 
    extern "C" IID IID_IY; 
    extern "C" IID IID_IZ; extern "C" 
    { extern const IID IID_IX={ 
    0x8c0d4fb0, 0xe6b9, 
    0x47ec,  0x81, 0x35, 0xb6, 0x7e, 0x65, 0x41, 0xf9, 0x12 
    }; // {A2D7DFDF-E9E7-46cd-8A57-5EC3CC586807} 
    extern const IID IID_IY={ 
    0xa2d7dfdf, 0xe9e7, 0x46cd, 
    0x8a, 0x57, 0x5e, 0xc3, 0xcc, 0x58, 0x68, 0x7 }; // {C301B0CB-3AB8-42a3-8F3F-ABD9AF50A919} 
    extern const IID IID_IZ={ 
    0xc301b0cb, 0x3ab8, 0x42a3,  
    0x8f, 0x3f, 0xab, 0xd9, 0xaf, 0x50, 0xa9, 0x19 
    }; 
    }; 把这个做为一个工程文件加入到你的工程中
      

  6.   

    把定义和声明放在一起没有定义的CLSID是没办法使用COM组件的
    COM的组件创建是依靠CLSID的