在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 个无法解析的外部命令
#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 个无法解析的外部命令
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的值
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
};
}; 把这个做为一个工程文件加入到你的工程中
COM的组件创建是依靠CLSID的