Re: [SOLVED] RE: How to access password protected shared network drive
Hi, your code is working fine. Thank u very much.
"Simonas Leleiva" <sledge@work.lt> wrote in message
news:53AE2888-780E-48CE-BAD2-B1C5CA54FB55@microsoft.com...
"Simonas Leleiva" wrote:
"Simonas Leleiva" wrote:
<...>
// Now moving on to the next one:
// If we've succeeded, and the connection is made, how to
// force expand the Network PC's shares? As in Browse For Folderq
// that PC remains collapsed and no '+' appears (we'd need to re-expand
// the workgroup or so..)
if (dwRet == ERROR_SUCCESS)
// What goes here then? { }
Here's what:
SendMessage(hwnd, BFFM_SETEXPANDED, FALSE, lParam);
And now the whole code to cover this issue:
CALLBACK CCfgLocationAndConnection::BrowseCallbackProc( HWND hwnd, UINT
uMsg, LPARAM lParam, LPARAM lpData)
{
if ( uMsg == BFFM_INITIALIZED || uMsg == BFFM_SELCHANGED )
{
TCHAR newPath[MAX_PATH+1];
SHGetPathFromIDList( (LPITEMIDLIST)lParam, newPath );
// If the selection is a network share (shared _folder_),
// newPath points to it O.K.
// However, if this is a top level network PC, newPath == "" :(
if (*newPath == 0)
{
// Let's work this around:
CComPtr<IShellFolder> pSHFolder;
SHGetDesktopFolder(&pSHFolder);
STRRET strret;
pSHFolder->GetDisplayNameOf((LPITEMIDLIST)lParam,
SHGDN_FORPARSING, &strret);
// It is the only known way [by me] to get the name of a
network
PC
// as you cannot pass it by (list its shares) -- the password
dialog
// would popup in any case in Windows Explorer (but, remember,
not in
// SHBrowseForFolder). I.e., not having a connection to that
PC,
// will not further expand its shares.
if (strret.uType == STRRET_WSTR)
// A check for prefixing double back-slash, as you may
have
selected
// a domain/workgroup name, -- these entries have to be
filtered out
if (strret.pOleStr[0] == '\\' &&
strret.pOleStr[1] == '\\')
_tcscpy(newPath, CW2T(strret.pOleStr));
}
if (*newPath)
{
NETRESOURCE nres;
ZeroMemory(&nres, sizeof(NETRESOURCE));
nres.dwType = RESOURCETYPE_DISK;
nres.lpRemoteName = newPath;
TCHAR *dom = _tcschr(nres.lpRemoteName+2, '\\');
if (dom) *dom = 0;
DWORD dwRet = 0;
do
{
dwRet = WNetAddConnection3(NULL, &nres, NULL, NULL,
CONNECT_INTERACTIVE);
} while (
// dwRet == ERROR_INVALID_PASSWORD || // -- not
needed,
as CONNECT_INTERACTIVE IS set
// Logon failure: the user has not been granted the
requested logon type at this computer.
dwRet == ERROR_LOGON_TYPE_NOT_GRANTED
// unknown user name or bad password.
|| dwRet == ERROR_LOGON_FAILURE
// The router or provider is busy, possibly
initializing. The caller should retry.
|| dwRet == ERROR_BUSY
);
if (dwRet == ERROR_SUCCESS)
{
if (dom == NULL) // Expand only for Top Level Network
PCs, no need to expand every folder
// when traversing the tree with arrow
keys
SendMessage(hwnd, BFFM_SETEXPANDED, FALSE, lParam);
}
else;
/*
{
TCHAR szErr[MAX_PATH+1];
TCHAR szName[MAX_PATH+1];
WNetGetLastError(&dwRet, szErr, MAX_PATH, szName,
MAX_PATH);
MessageBox(hwnd, szErr, szName, MB_ICONHAND);
}
*/
}
}
}