您的位置:首页 > 其它

标准C程序symbian编译总结(1)

2009-03-04 14:01 239 查看
内核SYMBIAN编译总结
1           无需按照symbian的命名规范来,包括数据类型,只需要按照标准的C来就可以。
即:short 无需非要用 Tint16;
2           包含的头文件,也仅需标准C的库文件,无需其他头symbian特定文件。需要在mmp文件中指定标准C库:
SYSTEMINCLUDE   /epoc32/include /epoc32/include/libc/
LIBRARY          euser.lib estlib.lib
另外需要在退出dll的函数中调用一次:
#ifdef SYMBIAN_OS
CloseSTDLIB();
#endif
3           导出函数定义:一般先定义宏:
#define SYMBIAN_OS
 
#ifdef SYMBIAN_OS
#define API_IMPORT    IMPORT_C
#define API_EXPORT       EXPORT_C
#elif defined(WINDOWS)
#define API_IMPORT     __declspec(dllimport)
#define API_EXPORT     __declspec(dllexport) 
#else
#define API_IMPORT    
#define API_EXPORT    
#endif
其实在WINDOWS平台我们无需定义,我们可以使用DEF文件。这样我们可以定义如下形式:
#ifdef SYMBIAN_OS
#define API_IMPORT    IMPORT_C
#define API_EXPORT       EXPORT_C
#else
#define API_IMPORT    
#define API_EXPORT    
#endif
 
在头文件中声明导出函数使用API_IMPORT     一般头文件都要在(例如:my.h)
#ifdef __cplusplus
extern “C”
{
#endif
API_IMPORT void Fun1();
API_IMPORT int Fun2();
#ifdef __cplusplus
}
#endif
带有色彩部分的代码对所有平台都使用,声明为导出是C的函数;
 
在实现文件中定义导出函数使用API_EXPORT
#include “my.h”
API_EXPORT void Fun1()
{
        ………
}
 
4           Symbian OS 有的采用了EKA2,那么该内核支持全局变量,称为global WSD(Writable Static Data). 如果是其他版本,则需要采用没有全局变量的形式,采用TLS形式:
4.1          定义一个全局的数据结构;
typedef struct
{
       CSuspectImgArray *pSuspectImgArray ;
       SLINEINFO *pGlobalCurLine;
       SWORDINFO *pGlobalCurWord;
       TInt32 nSplitNum;
       BOOL   bInitFlag ;
       SEEDDICT   SeedDict[MAXLANG];
       TInt32     g_nLangNum; //recognition Language count
       SELFDICT   SelfDict;
} TGlobalData;
4.2          初始化函数中加上;
       TGlobalData* pD;
       pD = (TGlobalData*)new TGlobalData;//申请内存分配
       if( !pD )return STATUS_NO_ENOUGH_RAM;
       //设置thread local storage
       if(Dll::SetTls(pD) != KErrNone)
       {//主线程
              delete pD;
              return STATUS_FAILED;
       }
4.3          使用函数中
#ifdef SYMBIAN
     TGlobalData*  pD = (TGlobalData*)Dll::Tls();
     if ( !pD )
            return 0;
#endif
g_GlobalImg = pWordImg;
 
其中定义(也可以不这样定义,直接访问,之所以这样定义,是为了跟没有使用TLS的C程序好兼容,无需修改):
              #define       g_GlobalImg     pD->g_GlobalImg
4.4          最后释放函数
       delete (TGlobalData*)Dll::Tls();
       Dll::SetTls(NULL);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  symbian c import api dll delete