构建一个StaticDLL
在开放的头文件声明中对那些提供接口调用的函数或者变量加上IMPORT_C修饰符;在对应的函数实现CPP文件中对接口函数加上EXPORT_C修饰符。
In a statically loaded DLL, an import library is needed to resolve the reference at link time.
关于以下6个宏的说明:
这些宏被定义在 e32def.h 头文件中,如下:
#define GLREF_D extern #define GLDEF_D #define LOCAL_D static #define GLREF_C extern #define GLDEF_C #define LOCAL_C static |
后缀 _D 和 _C 是 EPOC 的的一个约定,_D 指数据声明(declaration of Data),_C 指代码定义(definition of Code)。
这里,static 被 LOCAL_C 和 LOCAL_D 所取代。
GLREF_C 和 GLREF_D 被指定为全局引用(GLobal REFerence):extern 。
GLDEF_C 和 GLDEF_D 指定了一个全局定义(GLobal DEFination)。这两个宏没有给出一个固定的定义,但是它们被作为函数和变量的记号。
从头开始新建一个HelloWorld程序。
1.新建一个新的Generic Symbian OS empty project,在对应的工程目录下生成空的mmp和inf文件。
2.新建一个CPP文件到工程里,IDE探测到新建了一个文件,在mmp里添加SOURCE选项
3.此时还不能link通过,要在mmp文件中指定项目所要连接的库文件,在helloworld中链接euser.lib,文件中添加了这一行 LIBRARY euser.lib
4.build project,在对应目录下生成HelloWorld.exe
5.helloworld.cpp的完整代码:
#include <e32base.h> #include <e32cons.h> _LIT(KTxtEPOC32EX,"EXAMPLES"); _LIT(KTxtExampleCode,"Symbian OS Example Code"); _LIT(KFormatFailed,"failed: leave code=%d"); _LIT(KTxtOK,"ok"); _LIT(KTxtPressAnyKey," [press any key]");
// public
LOCAL_D CConsoleBase* console; // write all your messages to this
LOCAL_C void doExampleL(); // code this function for the real example
// private
LOCAL_C void callExampleL(); // initialize with cleanup stack, then do example
GLDEF_C TInt E32Main() // main function called by E32
{ __UHEAP_MARK; CTrapCleanup* cleanup=CTrapCleanup::New(); // get clean-up stack
TRAPD(error,callExampleL()); // more initialization, then do example
__ASSERT_ALWAYS(!error,User::Panic(KTxtEPOC32EX,error)); delete cleanup; // destroy clean-up stack
__UHEAP_MARKEND; return 0; // and return
}
LOCAL_C void callExampleL() // initialize and call example code under cleanup stack
{ console=Console::NewL(KTxtExampleCode,TSize(KConsFullScreen,KConsFullScreen)); CleanupStack::PushL(console); TRAPD(error,doExampleL()); // perform example function
if (error) console->Printf(KFormatFailed, error); else console->Printf(KTxtOK); console->Printf(KTxtPressAnyKey); console->Getch(); // get and ignore character
CleanupStack::PopAndDestroy(); // close console
}
LOCAL_C void doExampleL() { _LIT(KTxtHelloWorld,"HelloWorld\n"); console->Printf(KTxtHelloWorld); }
|
今天还是有些问题:
有很多类将data member声明为public,为什么?跟OO的封装性是违背的啊!
阅读(1686) | 评论(1) | 转发(0) |