DLL封装接口问题

linux_hsylar 2016-07-26 10:24:35
目前项目需要封装一个DLL供第三方使用,项目所有的代码封装好了,现在需要为DLL封装个接口,现在想为DLL做个接口类,然接口类中有一个整个DLL需要使用的CMainApplication类的成员变量,给第三方暴露的接口,这些接口会调用CMainAppliation类的一些成员函数,这个怎么封装呢?
各位大神,做过的给一些思路,多谢!
...全文
242 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2016-07-26
  • 打赏
  • 举报
回复
另外,除非多进程 CWinApp 的派生类,exe 跟dll是不同的 所以dll 中定义的CWinApp 的派生类的对象,不要直接拷贝exe中的代码
lm_whales 2016-07-26
  • 打赏
  • 举报
回复
定义一个代理类,包装所有接口函数 代理类中有一个WinApp 的指针就可以了 可以先定义抽象代理类 在DLL中定义代理类的实现类 指针也封装在实现类里面 然后DLL中 1)定义一个函数,返回代理类对象的指针(类型为抽象代理类) 2)定义一个函数,销毁返回的代理类对象
_Tiny 2016-07-26
  • 打赏
  • 举报
回复
mark,关注下。
列子汤问 2016-07-26
  • 打赏
  • 举报
回复
把CMainApplication抽象出来,定义一个CApp的类,然后把这个类暴露出去。
引用 7 楼 akirya 的回复:
接口要C兼容,不然会坑死自己的。
深有同感!!
linux_hsylar 2016-07-26
  • 打赏
  • 举报
回复
还有个问题,就是上面的代码中的MainApplication.h头文件包含了很多其他的xxxx.h头文件,如果应用程序使用DLL的时候,是需要 提供DLL.h文件的吧,而DLL.h中包含了MainApplication.h在调用DLL的应用程序中 根本找不到MainApplication,h 就是下面: #include "Dll.h" //就是上面写的那个dll.h头文件,里面包含有MainApplication.h,这个dll.h在DLL项目中可以被识别,而在 //主程序中识别不了,难道还需要把CMainApplication类的声明卸载Dll.h中? #pragma comment( lib,"DLL.lib") typevoid void (*DLLPROC)void(); int main() { HINSTANCE hInstDll; DLLPROC GISMain; hInstDLL = ::LoadLibrary("DLL.dll“); if( hInstDll!= NULL ) { GISMain(); } }
赵4老师 2016-07-26
  • 打赏
  • 举报
回复
提醒楼主:现在是开源时代。
linux_hsylar 2016-07-26
  • 打赏
  • 举报
回复
引用 6 楼 yshuise 的回复:
不要用c++封装,而直接用c语言函数作为借口
不封装成类,CMainApplication作为参数传给DLL导出函数?
  • 打赏
  • 举报
回复
接口要C兼容,不然会坑死自己的。
yshuise 2016-07-26
  • 打赏
  • 举报
回复
不要用c++封装,而直接用c语言函数作为借口
lm_whales 2016-07-26
  • 打赏
  • 举报
回复
void DelDllBase(CDllBase* pDllBase) { delete pDllBase; pDllBase = NULL; } class CDllBase { public: CMainApplication* m_pMainApplication; public: virtual void InitMainApp() =0; virtual void ShowD3D() = 0; virtual ~CDllBase()=0;//可能需要这个样子,最好有虚析构函数,虚析构函数,也必须实现,你试试吧 };
linux_hsylar 2016-07-26
  • 打赏
  • 举报
回复
引用 3 楼 lm_whales 的回复:
另外,除非多进程 CWinApp 的派生类,exe 跟dll是不同的 所以dll 中定义的CWinApp 的派生类的对象,不要直接拷贝exe中的代码
//dll,h #incldue "MainApplication.h" class CDllBase { public: CMainApplication* m_pMainApplication; public: virtual void InitMainApp() =0; virtual void ShowD3D() = 0; }; #ifdef EXPORTING_DLL extern "C" __declspec(dllexport) CDllBase* GetDllBase(void); extern "C" __declspec(dllexport) void DelDllBase(CDllBase* pDllBase); #else extern "C" __declspec(dllimport) CDllBase* GetDllBase(void); extern "C" __declspec(dllimport) void DelDllBase(CDllBase* pDllBase); #endif //.cpp class CGisDll :public CDllBase { public: virtual void InitMainApp(); virtual void ShowD3D(); } void CGisDll::InitMainApp() { m_pMainApplication = new CMainApplication(); } void CGisDll::ShowD3D() { } CDllBase* GetDllBase(void) { return new CGisDll(); } void DelDllBase(CDllBase* pDllBase) { pDllBase = NULL; } 大神,流程是这样的么?

64,671

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧