Niky,
First, pass a reference only when you are certain the origin variable will not go out of scope.
Second, I prefer to use an 'Interface' to obtain data in dialogs, windows and threads. If you use an interface you can always move the resource to another code location and not have to change all the previous code that used the interface to obtain the data.
struct SessionStatus{
CString user;
CString ID;
COleDateTime loggedIn;
};
class IStatusProvider{
SessionStatus& getStatus();
};
class MyDoc : public CDocument, public IStatusProvider{
protected:
SessionStatus _status;
public:
SessionStatus& getStatus(){ return _status; }
};
class MyDlg : public CDialog{
protected:
IStatusProvider* _pStatusProvider;
public:
void setStatusProvider( IStatusProvider* pProvider){
_pStatusProvider = pProvider;
}
}
void MyDoc:

nSomeEvent(...){
MyDlg dlg();
dlg.setStatusProvider(this);
dlg.DoModal();
}
LRESULT MyDlg::OnInitDialog(..){
SessionStatus& sStat = _pStatusProvider->getStatus();
}
"But, that's just my opinion... I could be wrong".
-pete