一、编写动态链接库
首先建立一个工程文件DllTry.mmp内容如下:
TARGET DllTry.dll
TARGETTYPE dll
UID 0x1000008d 0x2000118d
SOURCEPATH ../src
SOURCE DllTry.cpp
USERINCLUDE . ../inc
SYSTEMINCLUDE /epoc32/include
LIBRARY euser.lib
EXPORTUNFROZEN
建立bld.inf文件,如下:
PRJ_MMPFILES
../src/DllTry.mmp
头文件DllTry.h,如下:
#ifndef __DLL_TRY_H
#define __DLL_TRY_H
#ifndef __W32STD_H__
#include <w32std.h>
#endif
#ifndef __E32STD_H__
#include <E32STD.H>
#endif
#ifndef __E32BASE_H__
#include <e32base.H>
#endif
class CDllTry : public Cbase {
public:
static CDllTry* NewL();
static CDllTry* NewLC();
virtual TBool TestMethod();
TInt ii;
CDllTry();
~CDllTry();
private:
void ConstructL();
};
EXPORT_C CDllTry* Create(); //声明导出函数
#endif
代码文件DllTry.cpp,如下:
#include "DllTry.h"
//入口
EXPORT_C TInt E32Dll(TDllReason) {
return KErrNone;
}
//实例化CDllTry
EXPORT_C CDllTry* Create() {
return CDllTry::NewL();
}
CDllTry* CDllTry::NewL() {
CDllTry* self = NewLC();
CleanupStack::Pop(self);
return self;
}
CDllTry* CDllTry::NewLC() {
CDllTry* self = new(ELeave) CDllTry();
CleanupStack::PushL(self);
self->ConstructL();
return self;
}
TBool CDllTry::TestMethod() {
return ETrue;
}
CDllTry::CDllTry() {}
CDllTry::~CDllTry() {}
void CDllTry::ConstructL() {
ii=99; //可以是随便的一个数
}
然后,编译,把头文件DllTry.h复制到测试程序的inc目录,把DllTry.dll复制到某一特定目录(如z:/system下)。
二、实现测试程序
随便建立一个工程,在想导入DLL的地方输入代码如下:
RLibrary lib;
TLibraryFunction Create= NULL; //函数指针
if( lib.Load ( _L("DllTry.dll/n") , _L("z://system//") ) != KErrNone) //动态导入DLL
User::Exit( 40 );
//至此,导入完成!
Create=lib.Lookup ( 1 ); //获得第一个导出函数
iDllTry= (CDllTry*) Create(); //利用这个函数实例化CDllTry
if( !iDllTry )
User::Exit( 41 );
大家知道,在一定条件下(用同一编译器等)我们可以通过指针(当然引用也行)调用DLL文件中声明的类的虚函数。代码如下:
if(!iDllTry->TestMethod () )
User::Exit(43);
提示:
1、
在导出函数前必须加EXPORT_C;
2、
在.exe或.app中引用的.dll中的成员函数一定要为虚函数(virtual);
3、 .dll文件生成后在D:/Symbian/6.1/Series60/Epoc32/Release/wins/udeb类似的目录下;
4、
千万别忘了在.exe或.app工程里加入DllTry.h文件;
5、
第一个UID用来标志dll文件,第二个是自己向Symbian申请的。
大家自己试一试吧!