WNetAddConnection2返回错误86但net use可正常连接Windows NT4共享如何解决
问题原因
你代码里有两个核心问题导致调用失败:
- NETRESOURCE结构体未初始化
你只赋值了4个成员,剩下的dwScope、dwUsage、dwDisplayType等成员都是栈上的垃圾值,WNetAddConnection2执行时会读取这些无效值,导致参数解析错误。 - 编码不匹配
WNetAddConnection2默认跟随项目配置调用宽字符版本(WNetAddConnection2W),但你传入的远程路径、用户名、密码都是ANSI编码的char*类型,函数会把ANSI字符串当成宽字符串解析,自然会识别为错误密码,抛出错误码86。
另外你贴的代码里std::string remote行末尾漏了分号,应该是粘贴失误。
修正方案
你可以选择以下任意一种方案修复:
方案1:明确调用ANSI版本接口(适配你现有字符串类型)
#include <windows.h> #include <iostream> #include <cstring> int main() { NETRESOURCE nr; // 先清零整个结构体,避免无效值 memset(&nr, 0, sizeof(nr)); std::string remote{"\\\\192.168.178.22\\c$"}; nr.dwType = RESOURCETYPE_ANY; nr.lpLocalName = NULL; nr.lpRemoteName = remote.data(); nr.lpProvider = NULL; // 明确调用ANSI版本的接口,匹配传入的char*参数 auto res = WNetAddConnection2A(&nr, "test", "User", 0); if (res == NO_ERROR) { std::cout << "Connected\n"; } else { std::cout << "Error code: " << res << '\n'; } }
方案2:全部使用宽字符类型匹配默认Unicode接口
#include <windows.h> #include <iostream> #include <cstring> int main() { NETRESOURCE nr; memset(&nr, 0, sizeof(nr)); std::wstring remote{L"\\\\192.168.178.22\\c$"}; nr.dwType = RESOURCETYPE_ANY; nr.lpLocalName = NULL; nr.lpRemoteName = remote.data(); nr.lpProvider = NULL; auto res = WNetAddConnection2W(&nr, L"test", L"User", 0); if (res == NO_ERROR) { std::wcout << L"Connected\n"; } else { std::cout << "Error code: " << res << '\n'; } }
为什么net use可以连接成功
net use命令内部调用WNet系列接口时,会自动完成结构体初始化、编码适配、老版本SMB协议协商等操作,不会出现你手写代码里的参数错误问题。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

