2012-03-20 104 views
0

我使用visual studio 2010 MFC來構建C++程序。我的程序調用一個不屬於項目的DLL,它接受一個char *。我有一個函數獲取LPCTSTR格式的字符串。我已經在谷歌大約兩個小時了,沒有找到解決辦法。如何將表單MFC LPCTSTR轉換爲char *。我發現的一切都不起作用,或者只是不編譯。C++ LPCTSTR to char *

+3

您在項目中使用unicode嗎? – Torsten 2012-03-20 06:31:11

回答

3

在MFC的最簡單的是通過CStringA轉換(條件是得到的緩衝區將是一個只讀參數):

LPCTSTR pszA = ... 
CStringA sB(pszA); 
const char* pszC = sB; 
char* pszD = const_cast<char*>(pszC); 

其他選項是可用的和進行了討論:

+0

如果可以避免,請不要使用'CString'。 – Puppy 2012-03-20 06:41:46

+0

CString沒有問題。與ATL(無MFC)一起使用。 – selbie 2012-03-20 06:44:29

+1

在MFC中'CString'是「本地」字符串持有者類,完美工作。 'std :: string'也很好,它的優點是 - 從最近開始 - 是標準庫的一部分。不過這個問題顯然是關於'MFC'的。 – 2012-03-20 07:15:28

0

LPCTSTR要麼定義爲const wchar_t *或根據您的項目是否定義預處理器符號UNICODE一個const char *(或_UNICODE,我忘了一個MFC使用)。

因此,解決您的問題取決於您是否使用UNICODE設置。

如果您使用它,則需要將字符串轉換爲窄字符串。使用CStringA來執行此操作。

如果你不使用UNICODE,你需要創建一個可變的副本並將它傳遞給DLL,以防它想修改字符串。您可以使用CString創建副本來完成此操作。

在這兩種情況下,一旦你有一個CString對象的副本然後使用GetBuffer方法得到一個可變的字符串指針,調用DLL函數,然後調用後調用ReleaseBuffer

+0

如果可以避免的話,千萬不要使用CString。使用'std :: string'來製作副本。 – Puppy 2012-03-20 06:41:20

+2

@DeMemG如果可以避免的話,不要使用MFC。而且你如何從'std :: string'獲得'char *'?在MFC世界中使用時,使用MFC類沒有任何問題。 – Praetorian 2012-03-20 06:43:51