0

我正在尝试将字符串转换为 wchar_t 字符串以在 WNetUseConnection 函数中使用它。基本上它是一个看起来像这样的 unc 名称"\\remoteserver"。我得到一个返回码 1113,描述为:

目标多字节代码页中不存在 Unicode 字符的映射。

我的代码如下所示:

 std::string serverName = "\\uncDrive";
 wchar_t *remoteName = new wchar_t[ serverName.size() ];
 MultiByteToWideChar(CP_ACP, 0, serverName.c_str(), serverName.size(), remoteName, serverName.size()); //also doesn't work if CP_UTF8

 NETRESOURCE nr;
 memset( &nr, 0, sizeof( nr ));
 nr.dwType = RESOURCETYPE_DISK;
 nr.lpRemoteName = remoteName;

 wchar_t pswd[] = L"user"; //would have the same problem if converted and not set
 wchar_t usrnm[] = L"pwd"; //would have the same problem if converted and not set
 int ret = WNetUseConnection(NULL,  &nr, pswd, usrnm, 0, NULL, NULL, NULL);      
 std::cerr << ret << std::endl;

有趣的是,如果 remoteName 是这样的硬编码:

char_t remoteName[] = L"\\\\uncName";

一切正常。但由于稍后在服务器上,user 和 pwd 将是我作为字符串获得的参数,我需要一种方法来转换它们(也尝试了具有相同结果的 mbstowcs 函数)。

4

1 回答 1

1

MultiByteToWideChar 不会使用当前代码以 0 终止转换后的字符串,因此在转换后的 "\uncDrive" 后会出现垃圾字符

用这个:

std::string serverName = "\\uncDrive";
int CharsNeeded = MultiByteToWideChar(CP_ACP, 0, serverName.c_str(), serverName.size() + 1, 0, 0);
wchar_t *remoteName = new wchar_t[ CharsNeeded ];
MultiByteToWideChar(CP_ACP, 0, serverName.c_str(), serverName.size() + 1, remoteName, CharsNeeded);

这首先使用 MultiByteToWideChar 检查存储指定字符串和0 终止符需要多少个字符,然后分配字符串并进行转换。请注意,我没有编译/测试此代码,请注意拼写错误。

于 2011-02-16T10:40:05.563 回答