Search code examples
c++winapiunc

WNetUseConnection SystemErrorCode 1113 No Mapping Exist


I am trying to convert a string into a wchar_t string to use it in a WNetUseConnection function. Basicly its an unc name looking like this "\\remoteserver". I get a return code 1113, which is described as:

No mapping for the Unicode character exists in the target multi-byte code page.

My code looks like this:

 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;

The intersting thing is, that if remoteName is hard codede like this:

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

Everything works fine. But since later on the server, user and pwd will be parameters which i get as strings, i need a way to convert them (also tried mbstowcs function with the same result).


Solution

  • MultiByteToWideChar will not 0-terminate the converted string with your current code, and therefore you get garbage characters following the converted "\uncDrive"

    Use this:

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

    This first checks with MultiByteToWideChar how many chars are needed to store the specified string and the 0-termination, then allocates the string and converts it. Note that I didn't compile/test this code, beware of typos.