C++ 在T值中使用CString

C++ 在T值中使用CString,c++,mfc,C++,Mfc,我正在使用EAGetMail库,但我没有硬编码用户名和密码,而是尝试传递两个CString值作为凭据,但它似乎不喜欢这样 CString username; pObject->GetDlgItemText(IDC_EDIT1, username); CString password; pObject->GetDlgItemText(IDC_EDIT2, password); IMailServerPtr oServer = NULL; oServer.CreateInstance

我正在使用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));
这起作用了

//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;

使用C风格的字符指针是我们对操作系统进行低级系统调用所要付出的代价。微软使它变得更复杂,因为它有成对的系统调用,一个用于
char*
,另一个用于
wchar\t
。通常,您希望与一组或另一组保持一致,因此Microsoft提供了大量宏,以便您可以在摘要中引用字符的典型类型
TCHAR

\u T
是Microsoft特定的宏,您应该仅对字符串文本使用。编译Unicode程序时(当
TCHAR
wchar\t
时),它将
L
前置到文本,而对其他程序不做任何操作(其中
TCHAR
char

您已经演示了
IMailServer::User
将接受类型为
TCHAR const*
的字符串文本,但您将数据存储在一个n MFC
CString

从MFC CString对象的文档中:

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

您可以将CString转换为
TCHAR*
,但为此,您必须明确地执行以下操作:

oServer->User = (LPCTSTR)username;

或C++方式< /P>

oServer->User = static_cast<TCHAR const *>(username);
oServer->User=static\u cast(用户名);
这将调用以获取原始字符指针


(就我个人而言,我会使用
std::basic_string
而不是
CString
,但这就是我自己)。

嗨。请为我们添加足够的代码以验证和重现问题,特别是变量
User
\u T
的声明仅用于字符串文本。你需要说的是,如果你想要一个答案,<代码>用户<代码>的类型是什么?C++ + BSTRYT EGETMelObjiLb::IMAIListServer::USER,你可以尝试<代码> CCOMBSTR BSTRURBER;bstrUsername=username.AllocSysString();oServer->User=bstrUsername但请查看
oServer->User
的变量类型。我假设
BSTR
@jes:
\u T
宏是由实现提供的。为什么支持ANSI编码会让你的手变得脏兮兮的?这是一种不起作用的字符编码,最好假装它从未存在过。它做了我需要它做的事情!是否有人需要分配一个
BSTR
来立即分配另一份理智的东西,这是值得怀疑的。这是不理解他们编写的代码的人编写的代码。@IInspectable。我在努力,我在学习,所以请至少试着礼貌一点。我们都必须从某个地方开始。是的,我必须分配它两次工作,是的,我不知道为什么,但它的工作,所以这是一个开始!希望我能查个水落石出。如果我找到一个更好的方法来做我需要它做的事情,我一定会更新这个。我们仍然不知道,哪些数据类型是oServer->User-oServer->Password。请添加此信息从
CString
TCHAR const*
的转换是隐式的。@IInspectable我无法找到iMail服务器的文档,所以我不知道用户需要什么;可能是一个
BSTR
。无论如何,在两个隐式转换链中,您必须显式地执行一个转换。正确的是,您只能获得一个用户定义的转换。尽管如此,“您可以将
CString
转换为
TCHAR*
,但您必须明确地执行此操作”——虽然正确——并不是您要显示的内容。而您显示的内容是隐式发生的。@IInspectable我们将此设置为显式,以便隐式发生到BSTR的转换。
BSTR
wchar\u t*
的缩写。如果需要显式转换,则会出现错误。如果您使用的是隐式转换,那么您也有一个bug。
BSTR
的类型类似于C样式的字符串,但具有不同的语义。对不起,这个答案根本没用。