初识Symbian中DLL

来源:互联网 发布:上海网络广告公司 编辑:程序博客网 时间:2024/05/07 00:59
什么是lib文件,lib和dll的关系如何

(1)lib是编译时需要的,dll是运行时需要的。
如果要完成源代码的编译,有lib就够了。
如果也使动态连接的程序运行起来,有dll就够了。
在开发和调试阶段,当然最好都有。
(2)一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。静态编译的lib文件有好处:给用户安装时就不需要再挂动态库了。但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。
(3)在动态库的情况下,有两个文件,一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,DLL和.LIB文件必须随应用程序一起发行,否则应用程序将会产生错误。

.dll是在你的程序运行的时候才连接的文件,因此它是一种比较小的可执行文件格式,.dll还有其他的文件格式如.ocx等,所有的.dll文件都是可执行。
.lib是在你的程序编译连接的时候就连接的文件,因此你必须告知编译器连接的lib文件在那里。一般来说,与动态连接文件相对比,lib文件也被称为是静态连接库。当你把代码编译成这几种格式的文件时,在以后他们就不可能再被更改。
如果你想使用lib文件,就必须:
1 包含一个对应的头文件告知编译器lib文件里面的具体内容
2 设置lib文件允许编译器去查找已经编译好的二进制代码
如果你想从你的代码分离一个dll文件出来代替静态连接库,仍然需要一个lib文件。这个lib文件将被连接到程序告诉操作系统在运行的时候你想用到什么dll文件,一般情况下,lib文件里有相应的dll文件的名字和一个指明dll输出函数入口的顺序表。如果不想用lib文件或者是没有lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress。事实上,我们可以在Visual C++IDE中以二进制形式打开lib文件,大多情况下会看到ASCII码格式的C++函数或一些重载操作的函数名字。
一般我们最主要的关于lib文件的麻烦就是出现unresolved symble 这类错误,这就是lib文件连接错误或者没有包含.c、.cpp文件到工程里,关键是如果在C++工程里用了C语言写的lib文件,就必需要这样包含:
extern "C"
{
#include "myheader.h"
}
这是因为C语言写的lib文件没有C++所必须的名字破坏,C函数不能被重载,因此连接器会出错

 


 

在Carbide中新建Symbian的dll 工程,在自动生成的mmp文件中添加关键字EXPORTUNFROZEN,则在编译的时候可以生

成.lib,.dll,和.h文件
.lib和.dll在C:/S60/devices/S60_3rd_FP2_SDK_v1.1/epoc32/release/winscw/udeb目录下
.h在C:/S60/devices/S60_3rd_FP2_SDK_v1.1/epoc32/include目录下

 

mmp文件:

TARGET          DllNa.dll
TARGETTYPE      dll
UID             0x1000008d 0xEA64045E  //0x1000008d 是dll的标志,0xEA64045E  是系统随机生成的,发布的时候要用自己申请的UID

USERINCLUDE     ../inc
SYSTEMINCLUDE   /epoc32/include

SOURCEPATH      ../src

SOURCE          DllNa.cpp
SOURCE          DllNaDllMain.cpp

nostrictdef

//EXPORTUNFROZEN

LIBRARY         euser.lib

#ifdef ENABLE_ABIV2_MODE
  DEBUGGABLE_UDEBONLY
#endif

 

另:
想要在工程中生成def文件,则注释掉mmp文件中的关键字EXPORTUNFROZEN,先build,再Freeze,就可以生成。
但是def的具体作用还不是很明白。好像是调用dll中的函数的时候可以用到里面的生成的序号。

使用方法:
这是我自己的使用方法。
在需要使用的类中定义.h文件的类的对象,调用它的方法即可。

当然还要在mmp文件中添加lib

 

不用建立新的对象,直接调用dll的方法:

   TFileName fileName;
            _LIT(KNAME,"DllNa.dll");
            fileName = KNAME;

            RFs fs;
            fs.Connect();

            RLibrary library;
            library.Load(fileName);

            TLibraryFunction entry = library.Lookup(8);
            entry();
            library.Close();

 

 

生成.dso文件

1、选择phone release(gcce);
2、点击要生成DLL的工程,右键弹出菜单,选择freeze exports,会自动在工程下产生eabi目录并生成xxx.def文件

;若bwins目录下有xxx.def文件,删除之
3、在mmp文件中增加
#if defined (WINS)
#elif defined (GCC32)
DEFFILE ../bmarm/SocketEngine.def
#else
DEFFILE ../eabi/SocketEngine.def
#endif
nostrictdef
4、build
则可以在C:/Symbian/9.2/S60_3rd_FP1/Epoc32/release/armv5/lib中生成dso文件,同时也会在C:/Symbian/9.2/S60_3rd_FP1/Epoc32/release/gcce/urel中生成发布版的dll,一边在pkg文件中使用。


在PKG文件中打包测试:
如下:
"$(EPOCROOT)epoc32/release/gcce/urel/DllNa.dll" -"!:/sys/bin/DllNa.dll"

 

NOTE:

新建了一个dll工程,编译之后生成了dll文件,但是没有生成lib,在网上找了找,说:
build->freeze->build
但是没有成功,最后是这样解决的:
在mmp文件中添加关键字:EXPORTUNFROZEN
然后直接build就可以生成lib和dll了。

 

3版中使用DLL时可能遇到的问题
3rd在使用DLL库的时候,DLL库也是需要加入能力的
但是要注意一点,当你的工程能力多于工程中所使用的DLL的能力的时候
会报"无法执行的安全文件 -46"的错误.

 

 

________________________________________________________________

 

10-06-03

 

使用dll遇到问题总结

 

前面已经写了如何加载dll和调用dll中的函数。

 

当dll中的函数需要传递参数的时候,要是dll是用c++写的,直接用dll新建一个对象的接口新建一个对象,然后用该对象调用其它需要参数的函数。

 

当dll是用c写的,解决办法如下:

 

函数原型:int sip_addAccount(const char *domain, const char *username,const char *password);

 

 

typedef int (*sip_addAccount)(const char *domain, const char *username,const char *password);

 

 

调用的时候:

 

 

TLibraryFunction fun = iLibary.Lookup(4);

sip_addAccount fun3 = (sip_addAccount) fun;

 (*fun3)("192.168.22.31", "1010", "1234");

 

 

即可实现传递参数。

 

 

--------------------------------------------------

2010-06-04

 

总结一下:

 

DLL

 

文件:xxx.lib xxx.dll, xxx.dso, xxx{...}.dso

 

加载:LIBRARY xxx.lib

 

LIB

 

文件:xxx.lib

 

加载:STATICLIBRARY xxx.lib