首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > WinCE >

DLL 继承类接口的提供! 急解决方法

2013-12-07 
DLL 继承类接口的提供!!! 急怎么把带有继承关系的类提供给DLL调用者(APP)端使用?因为DLL代码是APP端独立出

DLL 继承类接口的提供!!! 急

怎么把带有继承关系的类提供给DLL调用者(APP)端使用?
因为DLL代码是APP端独立出来的,按照C++接口调用方式代码量很大,所以尽量不要改变APP端接口调用方式。

整个工程比较大,针对现在存在的问题,写一个小小的代码示例。

/*DLL,工程名dll*/
// 文件 CBase.h CImpl.h
//     CBase.cpp CImpl.cpp dll.cpp dll.def
// Include文件夹 ICBase.h ICImpl.h

// CBase.h
#ifndef __CBASE_H__
#define __CBASE_H__

#include "Include/ICBase.h"

class CBase : public ICBase
{
  public:
     CBase() {}
     ~CBase() {}
  public:
     virtual void test_cbase_virtual();
     vodi test_cbase_normal();
}

#endif

// CBase.cpp
#include "stdafx.h"
#include "CBase"

void CBase::test_cbase_virtual()
{
  printf("\ntest_cbase_virtual...");
}

void CBase::test_cbase_normal()
{
  printf("\ntest_cbase_normal...");
}

// ICBase.h
#ifndef __ICBASE_H__
#define __ICBASE_H__

class ICBase
{
  virtual void test_cbase_virtual() = 0;
  virtual void test_cbase_normal() = 0;
}

#endif

// CImpl.h
#ifndef __CIMPL_H__
#define __CIMPL_H__

#include "Include/ICImpl.h"

class CImpl : public ICImpl, public CBase
{
public:
  CImpl() {}
  ~CImpl() {}
public:
  virtual void test_virtual();
  void test_normal();
}
#endif

// CImpl.cpp
#include "stdafx.h"
#include "CImpl.h"

void CImpl::test_virtual()
{
  printf("\ntest_virtual");
}

void CImpl::test_normal()
{
  printf("\ntest_noraml");
}

// ICImpl.h
#ifndef __ICIMPL_H__
#define __ICIMPL_H__

class ICImpl
{
  public:
    virtual void test_virtual() = 0;
    virtual void test_normal() = 0;
}

#endif

// dll.cpp
#include "stdafx.h"
#include "CImpl.h"

BOOL APIENTRY DllMain()....
CImpl* g_pcImpl = NULL;
CImpl* CreateImpl()
{
  if (NULL == g_pcImpl)
  {
      g_pcImpl = new CImpl();
  }
  return g_pcImpl;
}
void DestoryImpl()
{
  if (g_pcImpl)
  {
   delete g_pcImpl;
   g_pcImpl = NULL;
  }
}

// dll.def
EXPROTS
  CreateImpl
  DestoryImpl

/*APP端, DLL提供Include文件夹给APP端*/

#include "../../dll/include/ICmpl.h"

void test_app_dll()
{
  HMODULE hdll = LoadLibrary(L"dll.dll");

 typedef ICImpl* (*fnCreate)();
 typedef void (*fnDestory)();

 fnCreate fn_Create = (fnCreate)(GetProcAddress(hdll, L"CreateImpl"));
 fnDestory fn_Destory = (fnDestory)(GetProcAddress(hdll, L"DestoryImpl"));

 ICImpl* pcImpl = fn_Create();
 if (pcImpl)
 {
  pcImpl->test_virtual(); // 正常调用
  pcImpl->test_normal(); // 正常调用
  // 在此处想调用CBase的方法
 }
 fn_Destory();

 FreeLibrary(hdll);
}


如果想调用CBase的方法,Include该怎么导出?
class ICImpl : public ICBase这样不行,ICBase无法成为纯虚接口。
[解决办法]
你用了ICImpl,那么ICImpl其实跟ICBase一点关系都没有,当然就用不了。
fn_Create();返回的对象继承了ICImpl,CBase,就可以调用。

[解决办法]
使用静态调用方式,include对应的头文件,然后使用
#pragma comment(lib,"Win32_Dll.lib")
来引用对应的lib库,这样就可以直接使用dll中的类了
[解决办法]
你只导出了IClmpl?其他都没有导出?如果是这样没啥办法
[解决办法]
就算有ICBase也没有用,就你的写好两个接口还是私有的。

热点排行