我写了一个COM组件,该组件要和客户程序进行数据交换
我的思路如下:
(1)在客户程序中定义一个数据类CDataAdmin
(2)在COM对象中:
(2.1)定义一个成员指针,CDataAdmin *m_pData
(2.2)定义一个接口IDataExchange
(2.3)在IDataExchange中定义方法void SetData(CDataAdmin *pData){m_pData=pData;}
(3)在客户程序中创建COM对象,通过QueryInterface获取IDataExchange,再通过SetData方法把外部的数据传送到COM内部 这一切看起来都很正常,应该能办到。但是小弟初学COM,对那个自定义的CDataAdmin类还有很多很大的疑问:
CDataAdmin类的CPP文件(类的实现)肯定要加到客户程序,这点应该没有疑问。但是在COM组件中呢?一定要加入CDataAdmin类的实现吗,可以不可以只加入它的头文件呢?
我想这样做的原因一是:CDataAdmin类已经在客户程序中实现了。另外一个更重要的原因是:我的CDataAdmin类用到了MFC中的类,而我的COM组件工程使用的是Win32 DLL形式,不支持MFC。将该类加入到COM DLL中之后,马上出现很多编译链接的错误,我不知道应该加上哪些库,而且怕会出现库的冲突。
我想请教各位,这种情况应该怎么解决呢?
(附:)CDataAdmin类的头文件
// DataAdmin.h: interface for the CDataAdmin class.
////////////////////////////////////////////////////////////////////////#if !defined(AFX_DATAADMIN_H__25573346_54F8_4E39_8840_5F25A681ACCF__INCLUDED_)
#define AFX_DATAADMIN_H__25573346_54F8_4E39_8840_5F25A681ACCF__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000#include <afxtempl.h>
#include <afxmt.h>class CFilePack;
class CDataAdmin
{
// Attributes
public:
HANDLE m_hBufEnough; // Buffer enough before run the filter graphprotected:
CMutex * m_pMutex;
bool m_bFlushing; CTypedPtrList <CPtrList, CFilePack*> DataList;
CTypedPtrList <CPtrList, CFilePack*> PoolList;// Operations
public:
CDataAdmin();
virtual ~CDataAdmin(); void SetFlushing(bool inFlush = true);
bool IsFlushing(void);
// List administrate
int ResetList(void);
int GetListSize(void);
CFilePack* GetDataBuffer(void);
int ReleaseDataBuffer(CFilePack* pData);
CFilePack* GetWriteBuffer(void);
int ReleaseWriteBuffer(CFilePack* pData); CFilePack* PointToDataHead(void);
int RollBackDataHead(CFilePack* pData); DWORD WaitForNext(DWORD inTimeOut);
};#endif // !defined(AFX_DATAADMIN_H__25573346_54F8_4E39_8840_5F25A681ACCF__INCLUDED_)
我的思路如下:
(1)在客户程序中定义一个数据类CDataAdmin
(2)在COM对象中:
(2.1)定义一个成员指针,CDataAdmin *m_pData
(2.2)定义一个接口IDataExchange
(2.3)在IDataExchange中定义方法void SetData(CDataAdmin *pData){m_pData=pData;}
(3)在客户程序中创建COM对象,通过QueryInterface获取IDataExchange,再通过SetData方法把外部的数据传送到COM内部 这一切看起来都很正常,应该能办到。但是小弟初学COM,对那个自定义的CDataAdmin类还有很多很大的疑问:
CDataAdmin类的CPP文件(类的实现)肯定要加到客户程序,这点应该没有疑问。但是在COM组件中呢?一定要加入CDataAdmin类的实现吗,可以不可以只加入它的头文件呢?
我想这样做的原因一是:CDataAdmin类已经在客户程序中实现了。另外一个更重要的原因是:我的CDataAdmin类用到了MFC中的类,而我的COM组件工程使用的是Win32 DLL形式,不支持MFC。将该类加入到COM DLL中之后,马上出现很多编译链接的错误,我不知道应该加上哪些库,而且怕会出现库的冲突。
我想请教各位,这种情况应该怎么解决呢?
(附:)CDataAdmin类的头文件
// DataAdmin.h: interface for the CDataAdmin class.
////////////////////////////////////////////////////////////////////////#if !defined(AFX_DATAADMIN_H__25573346_54F8_4E39_8840_5F25A681ACCF__INCLUDED_)
#define AFX_DATAADMIN_H__25573346_54F8_4E39_8840_5F25A681ACCF__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000#include <afxtempl.h>
#include <afxmt.h>class CFilePack;
class CDataAdmin
{
// Attributes
public:
HANDLE m_hBufEnough; // Buffer enough before run the filter graphprotected:
CMutex * m_pMutex;
bool m_bFlushing; CTypedPtrList <CPtrList, CFilePack*> DataList;
CTypedPtrList <CPtrList, CFilePack*> PoolList;// Operations
public:
CDataAdmin();
virtual ~CDataAdmin(); void SetFlushing(bool inFlush = true);
bool IsFlushing(void);
// List administrate
int ResetList(void);
int GetListSize(void);
CFilePack* GetDataBuffer(void);
int ReleaseDataBuffer(CFilePack* pData);
CFilePack* GetWriteBuffer(void);
int ReleaseWriteBuffer(CFilePack* pData); CFilePack* PointToDataHead(void);
int RollBackDataHead(CFilePack* pData); DWORD WaitForNext(DWORD inTimeOut);
};#endif // !defined(AFX_DATAADMIN_H__25573346_54F8_4E39_8840_5F25A681ACCF__INCLUDED_)
在IDataExchange中定义方法void SetData(IDataAdmin *pData)
但是在COM组件工程中加入IDataAdmin定义文件(.h文件)即可
在project settings->Link中我选择了Ignore All default libraries,我想知道这个Ignore到底省略了什么?