在_T值中使用CString

时间:2019-12-29 17:48:18

标签: c++ mfc

我正在使用EAGetMail库,但我没有尝试对用户名和密码进行硬编码,而是尝试传递两个CString值作为凭据,但似乎不喜欢这样。

CString username;
pObject->GetDlgItemText(IDC_EDIT1, username);

CString password;
pObject->GetDlgItemText(IDC_EDIT2, password);

IMailServerPtr oServer = NULL;
oServer.CreateInstance(__uuidof(EAGetMailObjLib::MailServer));

oServer->User = _T("myusername"); //THIS WORKS HARD CODED

不起作用:

oServer->User = username //Error, cannot be called with given argument list

我也尝试过:

oServer->User = _T(username); //L Username is undefined.

我想我需要以某种方式转换CString?

尝试了以下内容:

//Get Email Credentials
CString username;
pObject->GetDlgItemText(IDC_EDIT1, username);

CString password;
pObject->GetDlgItemText(IDC_EDIT2, password);


_bstr_t usernamea(pObject->GetDlgItemText(IDC_EDIT1, username));
_bstr_t passworda(pObject->GetDlgItemText(IDC_EDIT2, password));

2 个答案:

答案 0 :(得分:-1)

这行得通。

//Get Email Credentials
CString username;
pObject->GetDlgItemText(IDC_EDIT1, username);
CString password;
pObject->GetDlgItemText(IDC_EDIT2, password);

CComBSTR bstrUsername; bstrUsername = username.AllocSysString();
_bstr_t usernamea(bstrUsername);
CComBSTR bstrPassword; bstrPassword = password.AllocSysString();
_bstr_t passworda(bstrPassword);

oServer->User = usernamea;
oServer->Password = passworda;

答案 1 :(得分:-1)

使用C样式字符指针是我们对操作系统进行较低级别的系统调用所必须付出的代价。微软使它变得更加复杂,因为它具有成对的系统调用,一个用于char *,另一个用于wchar_t。通常,您希望与一组字符保持一致,因此Microsoft提供了许多宏,以便您可以抽象地引用典型字符类型TCHAR

_T是Microsoft特定的宏,您只能在字符串文字上使用。在编译Unicode程序时(当LTCHAR时,它在文字前加上wchar_t,而对其他程序(其中TCHARchar)不做任何处理。

您已经证明IMailServer::User将接受类型为TCHAR const *的字符串文字,但是您将数据存储在n MFC CString中。

从MFC CString对象的文档中:

  

CString对象将字符数据保留在CStringData对象中。 CString接受以NULL结尾的C样式字符串。 CString跟踪字符串长度以提高性能,但它也会在存储的字符数据中保留NULL字符以支持转换为LPCWSTR。 CString在导出C样式的字符串时包括空终止符。

您可以将CString转换为TCHAR *,但为此您必须明确地做到这一点:

oServer->User = (LPCTSTR)username;

或C ++方式

oServer->User = static_cast<TCHAR const *>(username);

这将调用CStringT<TCHAR>::operator PCXSTR以获取原始字符指针。

(我个人会使用std::basic_string<TCHAR>而不是CString,但这只是我)。