实现:ipc命名管道连接

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

#include 
#include 
#include 
#include 
#include 

//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    \n",argv[0]);
        wprintf(L"Usage: %s   \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;
}

你可能感兴趣的:(实现:ipc命名管道连接)