Chinaunix首页 | 论坛 | 博客
  • 博客访问: 318800
  • 博文数量: 88
  • 博客积分: 2051
  • 博客等级: 大尉
  • 技术积分: 950
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-14 23:59
文章分类

全部博文(88)

文章存档

2012年(3)

2011年(2)

2010年(9)

2009年(14)

2008年(60)

我的朋友

分类: C/C++

2008-05-03 17:51:57

构建一个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的封装性是违背的啊!

阅读(1623) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-08-06 14:29:49

是的,不应该把data member声明为public。二个情况是可以的。 第一,自己做的测试程序,不要求如此严格来封装,这样直接调用比较方便,以免为了访问data member还要做一个函数。 第二,就是内部类。内部类由上层封装,也是为了方便使用,要不要定义友元或定义成员方法才可以访问。这样对访问是很复杂的。内部类由外部的上层类来封装为private。