查找全局变量的方法
创建find_statics.bat文件内容如下:
rem ------ start of find_statics.bat ------
@echo off
for /R %%f in (*.o) do ( echo %%f & nm %%f > tmp.txt & find /I " d " < tmp.txt & find /I " b " < tmp.txt & find /I " g " < tmp.txt )
del /f tmp.txt 2> NULL:
rem ------ end of find_statics.bat ------
build以后将find_statics.bat放到 \Symbian\6.1\Series60\Epoc32\BUILD\yourapp\GROUP
目录下并在该目录下运行即可。
不支持全局变量的原因可参考如下文档:
Why doesn't Symbian OS support writeable static data
http://www3.symbian.com/faq.nsf/45aef46f9a8a61f9802569de0067eb63/71c212db06dce71380256d6e005ad2a8?OpenDocument
Does Symbian OS provide support for writeable static data (WSD)?
http://www3.symbian.com/faq.nsf/0/0840F25CBF63333680256FCC0063B5F3?OpenDocument
Writeable static data in DLLs
http://www.symbian.com/developer/techlib/v70docs/sdl_v7.0/doc_source/DevGuides/EssentialIdioms/StaticData.html#idioms%2estaticdata
如果你只是想定义一些可以随时随地访问的变量, 能想到的解决方案(推荐3):
1. 定义一个专门的数据类存放这些变量, 然后把该类对象(的引用)传来传去.
2.把这个变量定义成AppUi类的私有成员,并为它写公共的访问函数
// CMyAppUi
public: // new methods
TInt Share(); // return iShare
private:
TInt iShare;
通过下面的方式访问这个变量:
CMyAppUi* appUi = (CMyAppUi*)CCoeEnv::Static()->AppUi();
appUi->Share(); // :)
3. 跟2类似, 不过是使用自己定义的单态类,例子如下:
// DataSingleton.h: interface for the CDataSingleton class.
#include "e32base.h"
class CDataSingleton : public CBase
{
public: // constructor and destructor
static CDataSingleton* NewL();
virtual ~CDataSingleton();
private: // constructors
CDataSingleton(); // private because of the singleton pattern; it is
// guaranteed that only NewL will call it
void ConstructL();
};
// DataSingleton.cpp: implementation of the CDataSingleton class.
//
//
#include "DataSingleton.h"
//
// Construction/Destruction
//
CDataSingleton::CDataSingleton()
{
}
CDataSingleton::~CDataSingleton()
{
}
void CDataSingleton::ConstructL()
{
}
CDataSingleton* CDataSingleton::NewL()
{
CDataSingleton* singleton;
// Check thread local storage:
if ( Dll::Tls() == NULL )
{
// TLS is still null, which means that no CMySingleton has
// been instantiated yet. Do so now, and return that
// instance:
singleton = new ( ELeave ) CDataSingleton();
CleanupStack::PushL( singleton );
singleton->ConstructL();
CleanupStack::Pop( singleton );
// Store a pointer to the new instance in thread local storage:
TInt err = Dll::SetTls( static_cast( singleton ) );
if ( err == KErrNone )
{
return singleton;
}
else
{
delete singleton;
User::Leave( err );
return NULL;
}
}
else
{
// CMySingleton has been instantiated once already, so return
// that instance:
singleton = static_cast( Dll::Tls() );
return singleton;
}
}
注:此方法限于同一个线程中使用该单态类,如果想在新线程中使用,可在新线程中用Dll::SetTls( static_cast( singleton ) )设置Tls
4. EXE里可以有writable static data, 所以可以把相关功能封装到一个server里, 然后app应用程序访问此server.