使用RLibrary加载DLL

来源:互联网 发布:java输出倒九九乘法表 编辑:程序博客网 时间:2024/05/29 11:11

 

使用RLibrary加载DLL

 

  • 详细描述

下列代码片段演示了如何动态加载一个多态的DLL。对静态DLL来说,程序在启动时自动加载到RAM中。也可以在任何不需要的时候自动卸载。一个多态的DLL可以通过调用RLibrary::Load()加载,以及通过RLibrary::Close()卸载。多个多态DLL显示给客户端的可以是同样的接口。这种DLL一般由提供插件特性的框架来使用。

 

MMP文件

需要下列链接库和能力:

CAPABILITY      NoneLIBRARY         euser.lib

 

多态DLL

  • DLL的MMP文件中的UID2不能为0x1000008d(该UID2用于共享DLL),具体取值可以根据多态DLL的类型而定(如套接字服务器协议模块的UID2值为0x1000004A)
  • DLL所拥有的能力必须等于或大于加载它的程序。当加载时,DLL运行在加载进程的能力级。因此这个DLL必须要有所有能执行它的程序的能力,即使对另外一部分程序里面的代码并不需要用到其中的这种能力
  • DLL必须完成定义的虚接口类
  • DLL必须要有一个EXPORTED静态函数,其返回一个该接口类的示例


DLL的头文件应为:

class MMyDll    {    public:        virtual TInt Data() = 0;    };   class CMyDll : public MMyDll     {    public:        IMPORT_C  static MMyDll* NewL();        virtual TInt Data();    };

DLL源文件:

EXPORT_C MMyDll* CMyDll::NewL()    {    return new CMyDll();    } TInt CMyDll::Data()    {    return 1;    }

动态加载DLL

#include <e32std.h> RLibrary library; // Load dllUser::LeaveIfError(library.Load(_L("CMyDll")));      // Find exported functionTLibraryFunction NewL=library.Lookup(1);MMyDll* mydll=(MMyDll*) NewL();   // Close the librarylibrary.Close(); TInt value = mydll->Data();delete mydll;