此文章纯属自己记性不好记录用,勿喷。。。。
下面记录的是关闭vs2010导出类,以及导出类后的使用问题,由于有继承,导出类中包含动态库,所以记录以便以后查阅。
< name="code" class="cpp">#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”。
< name="code" class="cpp">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”。
< name="code" class="cpp">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; //音频渲染用directsoundprivate:};>
并且导出对象中的成员对象类如:CMediaDecoder m_MediaDecoder; //解码对象
也需要加上导出标志“API_DECLSPEC”。
还有继承的类如:class API_DECLSPEC CClass_Repeat_Play_Media : public CClass_Repeat_Play
也需要加上导出标志“API_DECLSPEC”。
下面是两个类的情况
类:CMediaDecoder
< name="code" class="cpp">class API_DECLSPEC CMediaDecoder{public: CMediaDecoder(); ~CMediaDecoder();private: bool m_bVideoDecodeInitOK; bool m_bAudioDecodeInitOK;};>
和类:CClass_Repeat_Play
< name="code" class="cpp">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 添加到:链接器->输入->附加依赖项中,否则出错
例如:
< name="code" class="cpp">#ifdef _EXPORTING//如果是导出库需要将此lib 添加到:链接器->输入->附加依赖项中,否则出错#else#pragma comment(lib,"tinyxml.lib")#endif>http://blog..net/flyer_2001/article/details/42612399 看这个链接。
三:
1:如果生成的动态库有相对路径,exe程序包含了生成的动态库,则这个相对路径是相对于exe程序的。