[MFC] Cum pasez CString unei functii Windows API?

Despre MFC, ATL si alte biblioteci C++ de la Microsoft (forum moderat)

[MFC] Cum pasez CString unei functii Windows API?

Mesajde Ovidiu Cucu » 11 Feb 2012, 11:27

Intrebare
Multe functii Windows API cer ca parametru LPCTSTR sau LPTSTR.
Cum pasez un tip CString acestor functii?

Raspuns
  • Daca se cere LPCTSTR, putem utiliza CString::GetString sau CString::opertor LPCTSTR.
  • Daca se cere LPTSTR, putem apela CString::GetBuffer sau CString::GetBufferSetLength.

Exemple
  1. Cod: Selectaţi tot
       // GlobalAddAtom gets LPCTSTR
       CString strAtom = _T("demo atom text");
       // ...
       ATOM atom = ::GlobalAddAtom(strAtom.GetString());
  2. Cod: Selectaţi tot
       // RegisterWindowMessage gets LPCTSTR
       CString strMsg = _T("demo message text");
       // ...
       UINT uMsg = ::RegisterWindowMessage((LPCTSTR)strMsg);
  3. Cod: Selectaţi tot
       // CreateDirectory gets LPCTSTR
       CString strDir = _T("demo directory");
       // ...
       BOOL bRet = ::CreateDirectory(strDir, NULL);
       // Note: implicit (LPCTSTR) cast has been performed.
  4. Cod: Selectaţi tot
       // GetCurrentDirectory gets LPTSTR
       CString strCurDir;
       ::GetCurrentDirectory(MAX_PATH, strCurDir.GetBuffer(MAX_PATH));
       strCurDir.ReleaseBuffer();

Note
  • Important: O greseala frecvent intalnita este de a face dublu cast (LPTSTR)(LPCTSTR):
    Cod: Selectaţi tot
       // GetSystemDirectory gets LPTSTR
       CString strSysDir;
       ::GetSystemDirectory((LPTSTR)(LPCTSTR)strSysDir, MAX_PATH);
       // ...
       // Bang!!! The program can crash, sooner or later.
  • CString::GetString nu exista in MFC6.0 sau mai vechi. Utilizati operatorul LPCTSTR care in fond face acelasi lucru.
  • In versiunile noi de MFC, CString este implementat ca teplate, in consecinta puteti gasi documentatia la CStringT si CSimpleStringT. De asemenea puteti gasi operatorul PCXSTR in loc de LPCTSTR. In orice caz, putem in continuare folosi "sintaxa veche" din exemplele date mai sus.

Resurse [MSDN]


<< Back to MFC index
Avatar utilizator
Ovidiu Cucu
Fondator
Fondator
 
Mesaje: 3776
Membru din: 11 Iul 2007, 16:10
Localitate: Iasi
Judet: Iaşi

[MFC] Cum pasez CString unei functii Windows API? [2]

Mesajde Ovidiu Cucu » 05 Dec 2013, 15:28

In loc de CString::GetBuffer sau CString::GetBufferSetLength plus CString::ReleaseBuffer, se poate folosi clasa comuna MFC/ATL CStrBuf.
Exemplul #4 de mai sus, se poate asfel rescrie mai compact, astfel:

Cod: Selectaţi tot
    CString strCurDir;
    ::GetCurrentDirectory(MAX_PATH, CStrBuf(strCurDir, MAX_PATH));


Resurse [MSDN]
Avatar utilizator
Ovidiu Cucu
Fondator
Fondator
 
Mesaje: 3776
Membru din: 11 Iul 2007, 16:10
Localitate: Iasi
Judet: Iaşi


Înapoi la MFC / ATL / WTL / WMI / GDI+

Cine este conectat

Utilizatorii ce navighează pe acest forum: Niciun utilizator înregistrat şi 1 vizitator