Mounting Network Drives

Environment: Windows 95, Visual C++ 6

We had a need for users to not tie up file sharing licenses all day when not needed.

Since they only needed the network drive mounted for one app, I embedded routines in the app to automatically check for the drive non-existence, prompt for password, and mount the drive.

I created the password screen exactly the same as the one NT shows for mounting drives. Then I created the wrapped class for it, called CDriveMountDlg.

In the application Doc.cpp, I check for a folder on the network drive. If it exists, fine, do nothing. Otherwise, call the CDriveMountDlg, and get the password.

I begin a loop of drive letters, attempting to mount the network drive for each one until successful, or I run out of letters. I save the letter for unmounting later.

#include <io.h> ...
BOOL CMounterDoc::OnNewDocument()
{
 if (!CDocument::OnNewDocument())
  return FALSE;

 // Check if \\APPS1\data is mounted
 // -1 means failed
 if( (_access( "\\\\apps1\\data\\parcel", 0 )) == -1 ) 
 {
  CDriveMountDlg  dlg;
  int response = dlg.DoModal();
  if (response == IDCANCEL)
   return FALSE;

  NETRESOURCE resource;
  resource.dwType = RESOURCETYPE_ANY;
  resource.lpRemoteName = "\\\\apps1\\data";
  resource.lpProvider = NULL;

  int nDrive = 4;
  CString sDrive;

  sDrive.Format("%c:", nDrive + 'A');
  resource.lpLocalName = sDrive.GetBuffer(2);

  DWORD result = WNetAddConnection2(&resource, 
   (LPCSTR)dlg.m_sPassword, NULL, 0);

  while ((result != 0) && (nDrive < 25))
  {
   nDrive++;
   sDrive.Format("%c:", nDrive + 'A');
   result = WNetAddConnection2(&resource, 
    (LPCSTR)dlg.m_sPassword, NULL, 0);
  }

  if (result != 0)
  {
   AfxMessageBox("Unable to find a free drive. Aborting.");
   return FALSE;
  }

  m_sDrive = sDrive;
  m_bMountFlag = TRUE;
 }
}

When the application exits, it calls OnCloseDocument



void CMounterDoc::OnCloseDocument() 
{
      if (m_bMountFlag)
      {
         DWORD result = WNetCancelConnection2(m_sDrive, 
		  0, TRUE);

         if (result != NO_ERROR)
         {
         // Error handling here
         }
      }
   CDocument::OnCloseDocument();
}

Finally, add the file mpr.lib to the project.

WNetAddConnection2 is also supposed to handle empty drive letter strings, creating an invisible connection. This works, although I was unable to disconnect later. Any solutions to this problem would be appreciated.

Downloads

Download demo project - 18 Kb


Comments

  • There are no comments yet. Be the first to comment!

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Live Event Date: December 11, 2014 @ 1:00 p.m. ET / 10:00 a.m. PT Market pressures to move more quickly and develop innovative applications are forcing organizations to rethink how they develop and release applications. The combination of public clouds and physical back-end infrastructures are a means to get applications out faster. However, these hybrid solutions complicate DevOps adoption, with application delivery pipelines that span across complex hybrid cloud and non-cloud environments. Check out this …

  • Due to internal controls and regulations, the amount of long term archival data is increasing every year. Since magnetic tape does not need to be periodically operated or connected to a power source, there will be no data loss because of performance degradation due to the drive actuator. Read this white paper to learn about a series of tests that determined magnetic tape is a reliable long-term storage solution for up to 30 years.

Most Popular Programming Stories

More for Developers

RSS Feeds