symbian的加载dll出现错误

来源:互联网 发布:咨询公司数据来源 编辑:程序博客网 时间:2024/05/16 04:34

今天做有米的塞班广告出现问题。我的主程序分成多个dll

RLibrary  libDll;
libDll.Lookup(1)出现错误
参考以下文章得到解决。



Symbian DLL(Dynamic Link Library 动态链接库)

热度 4已有 170 次阅读 2011-1-7 09:50|个人分类:Symbian|

Symbian DLL(Dynamic Link Library 动态链接库) 

Symbian 系统 支持两种类型的DLL:
  (1)静态接口DLL
  (2)多态接口DLL

(1)静态接口DLL

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

1. 通过Carbide 向导创建一个动态库工程

2. 添加自己的相应的接口API 的定义(在.h) 和 实现(在.cpp)

3. 在mmp 你们添加EXPORTUNFROZEN(为了在DLL开发时方便,不用每次修改了dll 接口,都要去删除def, dll, lib等文件,最后定稿时需要去掉该选项,详细说明见最后) 和在dll工程里用到的lib

4.Build 动态库工程

5. Freeze Exports

6. 再次Build 动态库工程

7. 如果编译winscw版本,在工程目录\bwins, 你可以看到def 文件

8. 在epoc32\release\winscw\udeb下你可以找到相应的lib 和 dll 文件

9.在epoc32\include\下,你可以找到动态库中的.h文件

(2)多态接口DLL

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

调用DLL方式1:

1. 在你的工程mmp 文件中,添加 动态库Name.lib

2. 在你要引用动态库的.h 或者 .cpp文件中, #include <动态库Name.h>

3. 操作这个动态库就像操作普通类一样, 当然你只能使用该动态库中被EXPORT出来的函数.

调用DLL方式2:

1. 在你的工程mmp 文件中,添加 动态库Name.lib

2. 在你要引用动态库的.h 或者 .cpp文件中, #include <动态库Name.h>

3. 用法:

typedef CWolfeggLogger* (*NewLogger)(TDesC&, TDesC& );

            // dynamic call                        
            _LIT(DLLName, "z:\\system\\WolfeggLogger.dll");
            const TInt KMaxLength = 100;
            RLibrary lib;
            if( lib.Load(DLLName) != KErrNone)      
                 {
                 RDebug::Print(_L("It's error!"));
                 User::Exit( 0 ); 
                 }
            
            NewLogger obj = (NewLogger)lib.Lookup(2);        
            CWolfeggLogger* logger = obj(logFilePath, phoneImsi);    
            logger->WriteL(CWolfeggLogger::EDebugLog, _L("Test text log"));
            delete logger;
            logger = NULL;
            lib.Close();

EXPORTUNFROZEN 介绍:

生成dll的一般步骤(不加EXPORTUNFROZEN):

bldmake bldfiles

abld reallyclean

abld build armv5 urel

abld freeze

bldmake bldfiles

abld reallyclean

abld build armv5 urel(通过这一步才会生成相应的lib文件,直接通过定稿的.def文件生成lib文件)

如果要修改dll API, 需要删除def, dll, lib等文件,重新执行以上步骤。

如果在开发阶段,需要经常修改dll API 和使用测试程序测试该 dll, 以上步骤就很繁琐 ,所以在mmp中加入EXPORTUNFROZEN后,不用每次修改了dll 接口,都要去删除def, dll, lib等文件,重新编译dll 并 freeze dll 即可。


from:http://blog.csdn.net/sanfengshou/archive/2010/11/23/6029911.aspx


原创粉丝点击