`
enter775
  • 浏览: 20864 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

静态接口DLL(IMPORT_C and EXPORT_C)

阅读更多

      DLL(Dynamic Link Library)是一段特殊的代码,它能够被外部程序在程序运行的时候调用。在DLL里面的代码可以同时被许多外部程序共享,而且不会引起手机内存的重复分配。

      DLL根据接口的类型Symbian系统支持两种类型的DLL:静态接口DLL多态接口DLL

      静态接口DLL在主调程序启动的时候被系统自动载入到手机内存里面(唯一的例外是如果该DLL是在ROM只读存储器里面,那么可以直接通过它的地址进行调用)。并且如果没有外部程序使用它了,它将被自动的从内存中卸载。静态接口DLL在系统内提供了一系列唯一的函数(例如,两个具有相同导出函数的DLL在系统中也不会混淆)。静态接口DLL具有.dll文件后缀,通常用于在Symbian系统中实现应用程序引擎(例如,与UI无关的代码)。

      多态接口DLL是只带一个单独导出函数的普通DLL,一般都是通过调用RLibrary::Load()函数才能被载入到内存中,而且在卸载的时候,也最好通过RLibrary::Close()函数进行卸载。多个多态接口DLL可以为外部程序导出多个相同函数名的函数。所以,这种DLL通常情况下被广泛应用于实现某个应用程序框架功能扩展时候的插件。在Symbian系统中,多态接口DLL可以有多种不同的文件后缀。其中最著名的一个就是.app结尾的(应用程序),.ldd(逻辑设备驱动),.tsy和.csy(电话和通信服务模块)等等。。。

       在本文中,我们将只关注静态接口DLL技术,它是你我在开发中最最常用的DLL类型。我们将以通用DLL的继续我们的内容。

      静态接口的DLL 从DLL调用者的角度 来看,DLL有三个文件组成:

     (1)头文件:.h的文件后缀,可以#include到主调程序的代码中去,只有在编译 的时候有用。

     (2)导出文件:.lib的文件后缀,可以由主调程序进行链接,这个文件记载了DLL的提供的所有接口函数名称和地址。(在arm版本中应该是dso后缀)

     (3)DLL文件本身:.dll的文件后缀包括所有.lib文件记载的接口函数的具体实现,主调函数在运行的时候实际调用和执行的部分。

      从DLL编写者的角度 来看,DLL可以被看成是一个完整的Symbian项目。它由以下几部分组成:

     (1)项目自己的MMP文件(在bld.inf文件中列出的)

     (2)一个头文件,指定了该DLL需要导出的接口

     (3)源代码文件,具体导出函数的实现 头文件 DLL的头文件与其它类的头文件的头文件非常类似。不同的地方在于使用了IMPORT_C 宏来定义所有导出函数:

 

class CMyEngine : public CBase

{

   public:

// These functions are visible by the

// clients of the DLL and needs to have

// the IMPORT_C tag

IMPORT_C static CMyEngine* NewL();

IMPORT_C static CMyEngine* NewLC();

IMPORT_C void MyPublicMethod();

IMPORT_C void AnotherPublicMethod();

...

private:

// These functions are not visible by the

// clients of the DLL and then do not need

// the IMPORT_C tag

 

CMyEngine();

void ConstructL();

void SomePrivateMethod();

}

 

 

实现文件 编写DLL工作本身没有什么需要复杂的地方,但是有两个重要的地方需要留意:

(1)E32Dll() 函数必须实现

(2)另外一个特殊的宏,EXPORT_C ,应该加在每个导出函数实现的前面。

例如:

 

// This function is mandatory for all DLLs

EXPORT_C TInt E32Dll(TDllReason)

{

return KErrNone;

}

// This function is exported: The EXPORT_C tag shall be used.

EXPORT_C void MyPublicMethod()

{

...

}

// This one is not: The EXPORT_C tag shall not be used.

void SomePrivateMethod()

{

// Do Something

}

 

 

MMP文件 DLL的MMP文件应该有以下特点

(1)定义项目(project)的类型是dll

(2)使用正确的UID2的值(0x1000008d) 在开发过程中,你也应该通过EXPORTUNFROZEN 告诉编译环境,DLL接口还没有定稿,还可以随时修改。

例如:

 

TARGET MyEngine.dll

TARGETTYPE dll

UID 0x1000008d

 

...

 

EXPORTUNFROZEN

 

把DLL接口定稿(Freezing DLL) 一旦你完成了DLL的开发,在你发行你的DLL版本之前,应该把接口定稿(Freezing)这样可以确定将来发行的DLL可以向下兼容。 通过将项目的MMP文件中的EXPORTUNFROZEN关键字去掉,用常规的方法重新建立DLL,来实现DLL库的定稿。这时候会有“.def文件不存在”的编译警告信息出现,不要紧,继续就建立当前项目,在项目编译完毕以后,你可以用如下命令定稿: abld freeze [platform]

例如

1、bldmake bldfiles;

2、abld build gcce;

3、abld freeze gcce;

 

注意:

这里通常有三个定稿的def文件夹:在二版本中编译armi时,用abld freeze armi产生的是BMARM文件夹和对应的Def;

在三版本中编译gcce和armV5时会产生EABI文件夹和对应的Def;

而用wins时则编译产生BWINS文件夹和对应的Def。

 

(个人总结) 所有的ARM平台共享一个.def文件,但是对于wins模拟器和winscw CodeWarrior环境来说,他们有不同的.def文件。 一旦项目已经定稿,重新生成makefile,这时候导入的lib会直接通过定稿的.def文件生成。

 

 

IMPORT_C 是一个宏,在 e32def.h 定义,意思是从 DLL 中导入函数。

 

#define IMPORT_C __declspec(dllexport)

 

如果一个 DLL 函数要被导入到应用程序那么这个函数必须首先以 IMPORT_C 声明,告诉编译器,这个函数可以在 DLL 中找到。

 

EXPORT_C 也是一个在 e32def.h 定义的宏,意思是从 DLL 中导出函数。

 

#define EXPORT_C __declspec(dllexport)

 

如果一个函数是 DLL API 的一部分, 并且要在应用程序或其他 DLL 中被调用,那么这个函数在C++源文件中必须实现为导出。

 

需要注意的是在 WINS 下, IMPORT_C 和 EXPORT_C 同时被定义为 __declspec(export)。

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Go编译32位GNU静态链接库的方法

    import "C" //export Add func Add(a, b int32) int32 { return a + b } func main() {} 注意我们必须把想要导出的函数显式使用//export Add注释标明,否则编译后不会产生对应的头文件。 Go侧编译 注意两点,需要...

    Symbian OS C++高效编程

    OS类的类别 22918.8 小结 229第19章 轻量级模板 230第20章 展示一个全面而易理解的API 23420.1 类布局 23520.2 IMPORT_C和EXPORT_C 23520.3 参数和返回值 23720.4 成员数据和功能抽象 24120.5 选择...

    peframe:PE框架

    --import Imported function and dll --export Exported function and dll --dir-import Import directory --dir-export Export directory --dir-resource Resource directory --dir-debug Debug directory --dir-...

    加密解密.技术内幕.chm

    1.2.2 IMAGE_NT_HEADERS头部 1.2.3 区块表(The Section Table) 1.2.4 各种块(Sections)的描述 1.2.5 输出表 1.2.6 输出转向(Export Forwarding) 1.2.7 输入表 1.2.8 绑定输入(Bound import) 1.2.9 延迟装入...

    软件加密技术内幕 chm

    7.3.3 外部检测(使用dll) 7.3.4 hook 相关的api(防止loader和调试api) 7.4 使用sdk把程序和壳溶为一体 7.4.1 sdk的意义 7.4.2 做一个带sdk的壳 7.5 后记:关于壳和程序的思考 第8章 Visual Basic 6 ...

    软件加密技术内幕

    7.3.3 外部检测(使用dll) 7.3.4 hook 相关的api(防止loader和调试api) 7.4 使用sdk把程序和壳溶为一体 7.4.1 sdk的意义 7.4.2 做一个带sdk的壳 7.5 后记:关于壳和程序的思考 第8章 Visual Basic 6 ...

    part03_软件加解密技术-软件加密》配套光盘 Delphi 7.0

    \Import Table..............获取输入表信息示例 \Export Table..............获取输出表信息示例 {其它源码} ToolsTest\OllyDbg................OllyDbg调试例子 \DeDe...................DeDe反编译例子

    part01_软件加解密技术-软件加密》配套光盘 Delphi 7.0

    \Import Table..............获取输入表信息示例 \Export Table..............获取输出表信息示例 {其它源码} ToolsTest\OllyDbg................OllyDbg调试例子 \DeDe...................DeDe反编译例子

    part04_软件加解密技术-软件加密》配套光盘 Delphi 7.0

    \Import Table..............获取输入表信息示例 \Export Table..............获取输出表信息示例 {其它源码} ToolsTest\OllyDbg................OllyDbg调试例子 \DeDe...................DeDe反编译例子

    part05_软件加解密技术-软件加密》配套光盘 Delphi 7.0

    \Import Table..............获取输入表信息示例 \Export Table..............获取输出表信息示例 {其它源码} ToolsTest\OllyDbg................OllyDbg调试例子 \DeDe...................DeDe反编译例子

    part02_软件加解密技术-软件加密》配套光盘 Delphi 7.0

    \Import Table..............获取输入表信息示例 \Export Table..............获取输出表信息示例 {其它源码} ToolsTest\OllyDbg................OllyDbg调试例子 \DeDe...................DeDe反编译例子

    完全掌握加密解密实战超级手册.z01

    462.1.3 PE文件格式的头结构 462.1.4 设置Optional Header可执行信息 492.1.5 Section Table结构数组 512.1.6 Import Table输入表 522.1.7 Export Table输出表 532.1.8 重定位表 542.2 简述代码分析实战 552.2.1 ...

    完全掌握加密解密实战超级手册.zip02

    442.1.1 PE格式文件概述 442.1.2 检验PE格式文件 462.1.3 PE文件格式的头结构 462.1.4 设置Optional Header可执行信息 492.1.5 Section Table结构数组 512.1.6 Import Table输入表 522.1.7 Export Table输出表 532.1...

    《软件加解密技术-软件加密》配套光盘

    自定义文件读写示例 \CreateDLL.................DLL的创建示例 \YSCall....................DLL的隐式调用 \XSCall....................DLL的显式调用 \CreateComponent...........包的示例 \FindWindow..............

    【软件加密技术内幕】

    5.6.2 句柄检测 <br/>5.7 反静态分析技术 <br/> 5.7.1 扰乱汇编代码 <br/> 5.7.2 花指令 <br/> 5.7.3 信息隐藏 <br/>5.8 代码与数据结合技术 <br/>5.9 软件保护的若干忠告 <br/> ...

Global site tag (gtag.js) - Google Analytics