Форум: "Сети";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
ВнизMicrosoft WNet праблем Найти похожие ветки
← →
alt7 (2004-03-15 11:20) [0]
Пишу в Делфях 6.
Задача состоит в том, чтоб по локальной сети подключиться к компьютеру и утянуть файлы с расшаренного диска. Беда в том что, один раз это работает (подключение, MoveFileEx, отключение), а на следующий раз вылетает ошибка: ERROR_SESSION_CREDENTIAL_CONFLICT.
Итак:
..
GetDriveType(PChar(NetDL[i]+":\")); // здесь определяем какая свободна буква на локальном компе
..
(1)
// Это у нас подключение
NetResource.dwType := RESOURCETYPE_DISK;
NetResource.lpLocalName := PChar(NetDrive_Letter+":");
NetResource.lpRemoteName := PChar(_NetPath);
NetResource.lpProvider := "";
DW_Res := WNetAddConnection2(NetResource,
PChar(_Password), {Password (if needed) or empty}
PChar(_Login), {User name (if needed) or empty}
CONNECT_UPDATE_PROFILE);
// Обработка различных ошибок
case DW_Res of
..
MoveFileEx
..
// Отключение
DW_Res := WNetCancelConnection2(PChar(NetDrive_Letter+":"),0,TRUE);
// Обработка различных ошибок
case DW_Res of
Один раз работает на ура, на второй раз в addconnection2 возникает ошибка ERROR_SESSION_CREDENTIAL_CONFLICT, то есть, как я думаю, Винда запомнила то мое подключение, и хотя я и делал CancelConnection (результат ее 0 - нет ошибки).
Пробовал перед (1) вставить перебор подключенных устройств и потом отключить, то что Винда запомнила:
DW_Res := WNetOpenEnum(RESOURCE_REMEMBERED,
RESOURCETYPE_ANY,
0,
nil,
hEnum);
repeat
lpnrDrv := PNETRESOURCE(GlobalAlloc(GPTR, cbBuffer));
DW_Res := WNetEnumResource(hEnum, cEntries, lpnrDrv, cbBuffer);
if (DW_Res = NO_ERROR) then
begin
for i := 0 to cEntries - 1 do
begin
if lpnrDrv^.lpLocalName <> nil then
// Тут я хотел отключить сетевой диск по букве (типа Z:)
DW_Res := WNetCancelConnection2(PChar(NetDrive_Letter+":"),0,TRUE);
case DW_Res of
// Обработка ошибок
..
ERROR_NOT_CONNECTED: MessageDlg("Некоторый текст",mtError,[mbOK],0);
end;
s := s + lpnrDrv^.lpLocalName + #9 + lpnrDrv^.lpRemoteName;
Inc(lpnrDrv);
end;
end
else if DW_Res <> ERROR_NO_MORE_ITEMS then
begin
s := s + "Cannot complete network drive enumeration";
GlobalFree(HGLOBAL(lpnrDrv));
break;
end;
GlobalFree(HGLOBAL(lpnrDrv));
until (DW_Res = ERROR_NO_MORE_ITEMS);
WNetCloseEnum(hEnum);
if s = "" then s := "No network connections.";
Вот. Но возникает ошибка с сообщением ERROR_NOT_CONNECTED. То есть мне говорят, что такого подключения нет, и отключать нечего.
Вопрос: как мне с этим справиться? Что тут у меня не так, или как иначе сделать мне, чтоб я мог нормально подключаться-переносить файлы-отключаться?
Thx заранее
← →
alt7 (2004-03-15 11:20) [0]
Пишу в Делфях 6.
Задача состоит в том, чтоб по локальной сети подключиться к компьютеру и утянуть файлы с расшаренного диска. Беда в том что, один раз это работает (подключение, MoveFileEx, отключение), а на следующий раз вылетает ошибка: ERROR_SESSION_CREDENTIAL_CONFLICT.
Итак:
..
GetDriveType(PChar(NetDL[i]+":\")); // здесь определяем какая свободна буква на локальном компе
..
(1)
// Это у нас подключение
NetResource.dwType := RESOURCETYPE_DISK;
NetResource.lpLocalName := PChar(NetDrive_Letter+":");
NetResource.lpRemoteName := PChar(_NetPath);
NetResource.lpProvider := "";
DW_Res := WNetAddConnection2(NetResource,
PChar(_Password), {Password (if needed) or empty}
PChar(_Login), {User name (if needed) or empty}
CONNECT_UPDATE_PROFILE);
// Обработка различных ошибок
case DW_Res of
..
MoveFileEx
..
// Отключение
DW_Res := WNetCancelConnection2(PChar(NetDrive_Letter+":"),0,TRUE);
// Обработка различных ошибок
case DW_Res of
Один раз работает на ура, на второй раз в addconnection2 возникает ошибка ERROR_SESSION_CREDENTIAL_CONFLICT, то есть, как я думаю, Винда запомнила то мое подключение, и хотя я и делал CancelConnection (результат ее 0 - нет ошибки).
Пробовал перед (1) вставить перебор подключенных устройств и потом отключить, то что Винда запомнила:
DW_Res := WNetOpenEnum(RESOURCE_REMEMBERED,
RESOURCETYPE_ANY,
0,
nil,
hEnum);
repeat
lpnrDrv := PNETRESOURCE(GlobalAlloc(GPTR, cbBuffer));
DW_Res := WNetEnumResource(hEnum, cEntries, lpnrDrv, cbBuffer);
if (DW_Res = NO_ERROR) then
begin
for i := 0 to cEntries - 1 do
begin
if lpnrDrv^.lpLocalName <> nil then
// Тут я хотел отключить сетевой диск по букве (типа Z:)
DW_Res := WNetCancelConnection2(PChar(NetDrive_Letter+":"),0,TRUE);
case DW_Res of
// Обработка ошибок
..
ERROR_NOT_CONNECTED: MessageDlg("Некоторый текст",mtError,[mbOK],0);
end;
s := s + lpnrDrv^.lpLocalName + #9 + lpnrDrv^.lpRemoteName;
Inc(lpnrDrv);
end;
end
else if DW_Res <> ERROR_NO_MORE_ITEMS then
begin
s := s + "Cannot complete network drive enumeration";
GlobalFree(HGLOBAL(lpnrDrv));
break;
end;
GlobalFree(HGLOBAL(lpnrDrv));
until (DW_Res = ERROR_NO_MORE_ITEMS);
WNetCloseEnum(hEnum);
if s = "" then s := "No network connections.";
Вот. Но возникает ошибка с сообщением ERROR_NOT_CONNECTED. То есть мне говорят, что такого подключения нет, и отключать нечего.
Вопрос: как мне с этим справиться? Что тут у меня не так, или как иначе сделать мне, чтоб я мог нормально подключаться-переносить файлы-отключаться?
Thx заранее
← →
Vlad Oshin © (2004-03-15 11:57) [1]а просто написать путь \\сервер\диск\папка\файл ?
← →
Vlad Oshin © (2004-03-15 11:57) [1]а просто написать путь \\сервер\диск\папка\файл ?
← →
alt7 (2004-03-15 12:10) [2]Пробовал я, не пускает... (расширивал каталоги на пользователя под которым лезу тудысь)...
Не помню, какая ошибка вылетает, но вылетает ;)
Да и причем здесь это?
Но тут вся работа застопорилась, потому что, еще пара таких путей нужно обрабатывать, а нет файлов с первого ресурса - нет обработки дальше.
← →
alt7 (2004-03-15 12:10) [2]Пробовал я, не пускает... (расширивал каталоги на пользователя под которым лезу тудысь)...
Не помню, какая ошибка вылетает, но вылетает ;)
Да и причем здесь это?
Но тут вся работа застопорилась, потому что, еще пара таких путей нужно обрабатывать, а нет файлов с первого ресурса - нет обработки дальше.
← →
Reindeer Moss Eater © (2004-03-15 12:15) [3]NetResource.lpLocalName := nil;
С файлом работать по UNC.
← →
Reindeer Moss Eater © (2004-03-15 12:15) [3]NetResource.lpLocalName := nil;
С файлом работать по UNC.
← →
Verg © (2004-03-15 12:34) [4]
> DW_Res := WNetAddConnection2(NetResource,
> PChar(_Password), {Password
> (if needed) or empty}
> PChar(_Login), {User name
> (if needed) or empty}
> CONNECT_UPDATE_PROFILE);
Убери это.
← →
Verg © (2004-03-15 12:34) [4]
> DW_Res := WNetAddConnection2(NetResource,
> PChar(_Password), {Password
> (if needed) or empty}
> PChar(_Login), {User name
> (if needed) or empty}
> CONNECT_UPDATE_PROFILE);
Убери это.
← →
alt7 (2004-03-15 12:49) [5]Спасибо, вместо CONNECT_UPDATE_PROFILE поставил 0 и заработало.
Читал хелп и так не понял про CONNECT_UPDATE_PROFILE ;)
То есть кусок кода с enum теперь не нужен? та беда с ERROR_SESSION_CREDENTIAL_CONFLICT не вылезет?
← →
alt7 (2004-03-15 12:49) [5]Спасибо, вместо CONNECT_UPDATE_PROFILE поставил 0 и заработало.
Читал хелп и так не понял про CONNECT_UPDATE_PROFILE ;)
То есть кусок кода с enum теперь не нужен? та беда с ERROR_SESSION_CREDENTIAL_CONFLICT не вылезет?
← →
Verg © (2004-03-15 13:07) [6]
> CONNECT_UPDATE_PROFILE
Дает указание запомнить это сет. подключение.
Т.е. если ты его создал с этим флагом, то оно будет существовать до тех пор, пока от него не откажешься с таким же CONNECT_UPDATE_PROFILE флагом.
Либо создавай без этого флага.
← →
Verg © (2004-03-15 13:07) [6]
> CONNECT_UPDATE_PROFILE
Дает указание запомнить это сет. подключение.
Т.е. если ты его создал с этим флагом, то оно будет существовать до тех пор, пока от него не откажешься с таким же CONNECT_UPDATE_PROFILE флагом.
Либо создавай без этого флага.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.038 c