估计有时你不想暴露所有的导出函数,导出一个类有时候更是不安全的。
以下这样做是否可以?
DLL中定义一个基类
- class IInterface
- {
- public:
- virtual void DFun1() = 0;
- virtual void DFun2() = 0;
- //……
- }
导出类从这个基类派生
- //Driver.h
- class CDriver : public IInterface
- {
- void DFun1();
- void DFun2();
- //……
- }
- //Driver.cpp
- void CDriver::DFun1()
- {
- }
- void CDriver::DFun2()
- {
- }
然后导出一个函数
- extern "C" BOOL WINAPI DoCreateInstance(void **ppv)
- {
- CDriver *pIns = new CDriver;
- if(pIns)
- {
- *ppv = (IInterface*)pIns; //如果CDriver从多个类派生注意转换
- return TRUE;
- }
- else
- {
- return FALSE;
- }
- }
用Depends.Exe查看这个DLL可以看到只有一个DoCreateInstance
然后客户就可以这样使用
- IInterface * pIns = NULL;
- typedef BOOL (WINAPI* LPFNDLLFUNC)(void **);
- HINSTANCE hDLL = LoadLibrary(_T("your dll path"));
- if(hDLL != NULL)
- {
- LPFNDLLFUNC lpfnDllFunc = (LPFNDLLFUNC)GetProcAddress(hDLL,"DoCreateInstance");
- lpfnDllFunc((void**)&pIns);
- if(pIns)
- {
- pIns->DFun1();
- pIns->DFun2();
- //……
- }
- }
(完) 有何错误欢迎指正。