实现:ipc命名管道连接

#pragma comment(lib, "mpr.lib")

#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <Winnetwk.h>
#include <string>

//using namespace std;

int wmain(int argc, wchar_t * argv[]) {
	///*
	//DWORD WNetAddConnection2W(
	//	LPNETRESOURCEW lpNetResource,
	//	LPCWSTR        lpPassword,
	//	LPCWSTR        lpUserName,
	//	DWORD          dwFlags
	//);
	//*/


	DWORD dwRetVal;
	std::wstring MyRemoteName;
	NETRESOURCE nr;
	DWORD dwFlags;

	MyRemoteName.append(L"\\\\");

	if (argc != 5 && argc != 4) {
		wprintf(L"Usage: %s <localname> <remotename> <username> <password>\n",argv[0]);
		wprintf(L"Usage: %s <remotename> <username> <password>\n",argv[0]);
		exit(1);
	}

	if (argc == 5) {
		MyRemoteName.append(argv[2]);
		wprintf(L"Calling WNetAddConnection2 with\n");
		wprintf(L"  lpLocalName = %s\n", argv[1]);
		wprintf(L"  lpRemoteName = %s\n", MyRemoteName.c_str());
		wprintf(L"  lpUsername = %s\n", argv[3]);
		wprintf(L"  lpPassword = %s\n", argv[4]);
		
		// Zero out the NETRESOURCE struct
		memset(&nr, 0, sizeof(NETRESOURCE));

		// Assign our values to the NETRESOURCE structure.

		nr.dwType = RESOURCETYPE_ANY;
		nr.lpLocalName = argv[1];
		nr.lpRemoteName = (LPWSTR)MyRemoteName.c_str();
		nr.lpProvider = NULL;

		// Assign a value to the connection options
		dwFlags = CONNECT_TEMPORARY;  //连接类型 是否可持续

		// Call the WNetAddConnection2 function to assign
		//   a drive letter to the share.
		//
		dwRetVal = WNetAddConnection2(&nr, argv[4], argv[3], dwFlags);
		//
		// If the call succeeds, inform the user; otherwise,
		//  print the error.
		//
		if (dwRetVal == NO_ERROR)
			wprintf(L"Connection added to %s\n", nr.lpRemoteName);
		else {
			wchar_t * pMsgBuf;
			FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS
				, NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&pMsgBuf, 0, NULL);
			wprintf(L"WNetAddConnection2 failed with error: %u, %ls \n", dwRetVal, pMsgBuf);
			LocalFree(pMsgBuf);
		}
	}
	else if (argc == 4) {
		MyRemoteName.append(argv[1]);
		wprintf(L"Calling WNetAddConnection2 with\n");
		wprintf(L"  lpRemoteName = %s\n", (LPWSTR)MyRemoteName.c_str());
		wprintf(L"  lpUsername = %s\n", argv[2]);
		wprintf(L"  lpPassword = %s\n", argv[3]);

		// Zero out the NETRESOURCE struct
		memset(&nr, 0, sizeof(NETRESOURCE));

		// Assign our values to the NETRESOURCE structure.

		nr.dwType = RESOURCETYPE_ANY;
		nr.lpLocalName = NULL;
		nr.lpRemoteName = (LPWSTR)MyRemoteName.c_str();
		nr.lpProvider = NULL;

		// Assign a value to the connection options
		dwFlags = CONNECT_TEMPORARY; //连接类型 是否可持续

		// Call the WNetAddConnection2 function to assign
		//   a drive letter to the share.
		//
		dwRetVal = WNetAddConnection2(&nr,argv[3], argv[2], dwFlags);
		//
		// If the call succeeds, inform the user; otherwise,
		//  print the error.
		//
		if (dwRetVal == NO_ERROR)
			wprintf(L"Connection added to %s\n", nr.lpRemoteName);
		else {
			wchar_t * pMsgBuf;
			FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS
				, NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&pMsgBuf, 0, NULL);
			wprintf(L"WNetAddConnection2 failed with error: %u, %s \n", dwRetVal, pMsgBuf);
			LocalFree(pMsgBuf);
		}
	}

	return 0;
}

posted @ 2020-01-14 00:37  zpchcbd  阅读(226)  评论(0编辑  收藏  举报