[我正在使用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));
使用C样式字符指针是我们对操作系统进行较低级别的系统调用所必须付出的代价。微软使它变得更加复杂,因为它具有成对的系统调用,一个用于char *
,另一个用于wchar_t
。通常,您希望与一组字符集保持一致,因此Microsoft提供了许多宏,以便您可以在摘要中引用典型字符类型TCHAR
。
_T
是Microsoft特定的宏,只应在字符串文字上使用。它在编译Unicode程序时(当L
IS TCHAR
时)在文字前加上wchar_t
,而对其他程序(TCHAR
为char
的其他程序)则不执行任何操作。
您已经证明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->用户= static_cast(用户名);
这将调用[CStringT<TCHAR>::operator PCXSTR](https://docs.microsoft.com/en-us/cpp/atl-mfc-shared/reference/csimplestringt-class?view=vs-2019#operator_pcxstr)
以获取原始字符指针。
(我个人会使用std::basic_string<TCHAR>
而不是CString
,但这只是我)。
此方法有效。
//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;