# CodeGuru Technical FAQs > CodeGuru Individual FAQs >  MFC: How to pass CString to Windows API functions?

## ovidiucucu

*Q*: Many Windows API functions require *LPCTSTR* (pointer to a constant string) or *LPTSTR* (pointer to a modifiable string buffer) as parameters. How to pass *CString* type to these functions?

*A*: 
 To get a pointer to const buffer (LPCTSTR) we can use *CString::GetString* or *CString::opertor LPCTSTR*. To get a pointer to modifiable buffer (LPTSTR) we can use *CString::GetBuffer*  or *CString::GetBufferSetLength*.

Examples


```
   // GlobalAddAtom gets LPCTSTR
   CString strAtom = _T("demo atom text");
   // ...
   ATOM atom = ::GlobalAddAtom(strAtom.GetString());
```



```
   // RegisterWindowMessage gets LPCTSTR
   CString strMsg = _T("demo message text");
   // ...
   UINT uMsg = ::RegisterWindowMessage((LPCTSTR)strMsg);
```



```
   // CreateDirectory gets LPCTSTR
   CString strDir = _T("demo directory"); 
   // ...
   BOOL bRet = ::CreateDirectory(strDir, NULL);
```



```
   // GetCurrentDirectory gets LPTSTR
   CString strCurDir;
   ::GetCurrentDirectory(MAX_PATH, strCurDir.GetBuffer(MAX_PATH));
   strCurDir.ReleaseBuffer();
```



Notes
 If need LPCTSTR, it's not absolutely necessary an explicit cast (see example #3 vs. #2). After a call of _GetBuffer_, don't forget to call _ReleaseBuffer_ (see example #4). *Important*: an often made mistake is to use double cast (LPTSTR)(LPCTSTR). This is not OK and can lead in troubles:


```
   // GetSystemDirectory gets LPTSTR
   CString strSysDir;
   ::GetSystemDirectory((LPTSTR)(LPCTSTR)strSysDir, MAX_PATH);
   // ...
   // Bang!!! The program can crash, sooner or later.
```

So, never do that! Call *GetBuffer* instead, as shown in example #4. *CString::GetString* is not available in MFC6.0 and older. Use *opertor LPCTSTR* which at last does the same. In newer MFC versions, CString is implemented using templates, then you can find the methods and operators docummented at *CStringT* and *CSimpleStringT*. Also, you can find operator PCXSTR instead of LPCTSTR. 
Anyway, you can still use the "old syntax", as shown in the above examples.

Resources [MSDN]
 CString::operator LPCTSTR (VS.6.0) CSimpleStringT::operator PCXSTR CString::GetBuffer (VS 6.0) CSimpleStringT::GetBuffer

----------


## ovidiucucu

Instead of *CString::GetBuffer* or *CString::GetBufferSetLength* plus *CString::ReleaseBuffer*, we can use shared MFC/ATL  *CStrBuf* class.
That way, the above example #4 can be re-written a little bit simpler, as follows:



```
    CString strCurDir;
    ::GetCurrentDirectory(MAX_PATH, CStrBuf(strCurDir, MAX_PATH));
```

Resources
 MSDN: CStrBufT Class

----------

