此文章纯属自己记性不好记录用,勿喷。。。。
下面记录的是关闭vs2010导出类,以及导出类后的使用问题,由于有继承,导出类中包含动态库,所以记录以便以后查阅。
#ifndef _EXPORTING
#define _EXPORTING
#endif
#ifdef _EXPORTING
#define API_DECLSPEC __declspec(dllexport) //导出
#else
#define API_DECLSPEC __declspec(dllimport) //导入
#endif
class API_DECLSPEC CClass_Repeat_Interface
{
public:
private:
public:
ClassRepeatEventIndex m_ClassRepeatEventIndex; //整个class的索引文件表
CClass_Repeat_HttpDownLoad_Extension1 * m_pHttpDownLoad_Extension1 ; //扩展1下载对象
CClass_Repeat_Play * m_p_Play; //整个class的播放对象
CClass_Repeat_Play_Media m_p_Play_Media[MAXMEDIAENTRY]; //音视频播放对象 数组
private:
};
一:
上面是接口类,类中的成员函数分为三种:
1:结构体,这里不记录无关紧要如:ClassRepeatEventIndex m_ClassRepeatEventIndex; //整个class的索引文件表
2:类指针,如:CClass_Repeat_HttpDownLoad_Extension1 * m_pHttpDownLoad_Extension1 ; //扩展1下载对象
3:类对象,如:CClass_Repeat_Play_Media m_p_Play_Media[MAXMEDIAENTRY]; //音视频播放对象 数组
其中的类指针如下:
这里不用加导出标志“API_DECLSPEC”。
class CClass_Repeat_HttpDownLoad_Extension1 : public CClass_Repeat_HttpDownLoad
{
public:
CClass_Repeat_HttpDownLoad_Extension1();
virtual ~CClass_Repeat_HttpDownLoad_Extension1();
//下载扩展数据
virtual int ClassRepeatDownLoad(const char * url, void * table);
//解析扩展数据
virtual int ClassRepeatPars(void * data);
private:
//将下载到的内容放到各自的索引表结构体中具体处理函数 //这里定义成static
static int HttpDownLoadExtension1Proc(char * data, int datasize,void * table,OutParameterlist * noutparalist);
public:
private:
};
其中类对象如下:
这里需要加导出标志“API_DECLSPEC”。
class API_DECLSPEC CClass_Repeat_Play_Media : public CClass_Repeat_Play
{
public:
private:
public:
CClass_Repeat_Play_Media();
CMediaDecoder m_MediaDecoder; //解码对象
int MeidaChannel; //机位号
CPlayAudio m_playSound; //音频渲染用directsound
private:
};
并且导出对象中的成员对象类如:CMediaDecoder m_MediaDecoder; //解码对象
也需要加上导出标志“API_DECLSPEC”。
还有继承的类如:class API_DECLSPEC CClass_Repeat_Play_Media : public CClass_Repeat_Play
也需要加上导出标志“API_DECLSPEC”。
下面是两个类的情况
类:CMediaDecoder
class API_DECLSPEC CMediaDecoder
{
public:
CMediaDecoder();
~CMediaDecoder();
private:
bool m_bVideoDecodeInitOK;
bool m_bAudioDecodeInitOK;
};
和类:CClass_Repeat_Play
class API_DECLSPEC CClass_Repeat_Play
{
public:
CClass_Repeat_Play();
virtual ~CClass_Repeat_Play();
private:
};
二:
下面是关于生成的动态库中包含了动态库,在工程中c/c++,链接器怎么配置问题
1:要生成的动态库例如叫"B",它自己包含的动态库叫“A”:
需要包含A的include路径,A的lib路径和A的lib文件
2:exe程序应用生成的动态库的工程
需要包含A的include路径,B的include路径,和B的lib路径和B的lib文件,并将A的dll文件和B的dll文件放到可执行文件同级目录中。
//如果是导出库需要将此lib 添加到:链接器->输入->附加依赖项中,否则出错
例如:
#ifdef _EXPORTING
//如果是导出库需要将此lib 添加到:链接器->输入->附加依赖项中,否则出错
#else
#pragma comment(lib,"tinyxml.lib")
#endif
http://blog.csdn.net/flyer_2001/article/details/42612399 看这个链接。
三:
1:如果生成的动态库有相对路径,exe程序包含了生成的动态库,则这个相对路径是相对于exe程序的。