Vba подключить сетевой диск
Я пытаюсь использовать строковые переменные ( exedir - полный каталог сетевого диска exe-файла и inputdir - расположение аргумента входного файла) для запуска exe с его аргументом с использованием оболочки в VBA.
Закомментированная строка в приведенном ниже скрипте не работает. Если я вручную настрою диск, используя букву, я смогу заставить его работать, как показано ниже, но используемые здесь входные файлы .exe и .lam находятся на сетевых дисках (переменная comp - это уникальное имя ПК пользователя, которое устанавливает имя входного файла .lam, поэтому имя входного файла отличается для каждого пользователя).
Я не слишком знаком с синтаксисом и позаимствовал его из других источников. Мне не хватает кавычек или, может быть, их слишком много в закомментированной строке?
Пример exedir: \\network\path\foo.exe
Пример inputdir: \\network\path\compname.lam
Я знаю о некоторых предыдущих вопросах, прочитав много, чтобы зайти так далеко.
Я не хочу указывать букву диска и в идеале хочу запускать .exe с входным файлом, используя строковые переменные для ввода всего. Одна из основных причин, по которой я хочу использовать только строки, заключается в том, что ими можно управлять с помощью одной переменной, и при изменении каталога (например, при обновлении .exe) этот скрипт будет легко обновить.
ОБНОВИТЬ
Следуя любезно предоставленным ниже комментариям, я прибыл сюда:
Где quote = chr(34) и fldr = \\network\path\
Интересно, что если inputdir определен как путь к дисководу с буквами ( inputdir = M:\etc ), это работает. Если это путь к сетевому диску ( inputdir = \\network\etc ), он запускается, но .exe немедленно вылетает из-за недопустимой операции с плавающей запятой.
Как я могу изменить это так, чтобы входной файл мог быть указан как сетевой путь?
Если это невозможно, мне, вероятно, понадобится подпрограмма, которая определяет, с какой буквой пользователь подключил сетевой диск, чтобы построить мою строку, например:
Создайте команду, которую вы собираетесь запустить с оболочкой, в переменной, а затем посмотрите на нее с помощью отладчика. Выглядит правильно?
Вам нужно знать, какой ценности вы пытаетесь достичь, чтобы сравнить с тем, что у вас есть, и знать, чего не хватает или чего нет.
@Comintern Спасибо и нет, экспериментирую. Я не поклонник всего синтаксиса "" ", но он начинает обретать больше смысла.
Dim Quote as String , Quote = Chr(34) , затем замените множество множественных кавычек на & Quote & , чтобы сделать его более читабельным. В какой-то момент у вас есть """""""" , который, на мой взгляд, оказывается """ , который состоит из трех двойных кавычек подряд, что, вероятно, неверно.
@FreeMan отличное предложение, спасибо
Я обновил приведенный выше вопрос своими выводами, используя ваши комментарии. Теперь мне просто нужно выяснить, почему путь к подключенному диску будет работать для входного файла, а сетевой путь - нет.
Еще актуально?
Речь идет о подключении к сетевому ресурсу из какого-то приложения, написанного на VB (или его разновидностях)?
Если оба ответа - "да", то могу привести примеры кодов на VBA для программного подключения/отключения сетевого ресурса: диска, каталога.
В принципе код предусматривает возможность подключения и к сетевому принтеру, но здесь у меня что-то пока не работает.
Основной инструмент - функции из комплекта Win32API. Годится?
Да, актуально! Из командной строки типа net use не годится. Пример с WinAPI тоже подойдет (особенно если с комментариями:)). Надо програмно отключить/подключить сетевой диск/ресурс (не принтер). Если есть пример без API - еще лучше!
Originally posted by pnvnik
Да, актуально! Из командной строки типа net use не годится. Пример с WinAPI тоже подойдет (особенно если с комментариями:)). Надо програмно отключить/подключить сетевой диск/ресурс (не принтер). Если есть пример без API - еще лучше!
Код на с (пардон с API)
DWORD ConnectRemoteDrive(LPSTR ShareName,LPSTR LocalDrive)
NETRESOURCE nr;
ZeroMemory(&nr,sizeof(nr));
nr.dwScope=RESOURCE_GLOBALNET;
nr.dwType=RESOURCETYPE_DISK;//RESOURCETYPE_ANY;
nr.dwDisplayType=RESOURCEDISPLAYTYPE_GENERIC;
nr.dwUsage=RESOURCEUSAGE_CONNECTABLE;
nr.lpLocalName=LocalDrive;
nr.lpRemoteName=ShareName;
nr.lpComment="";
nr.lpProvider=NULL;
Private Declare Function WNetAddConnection Lib "mpr.dll" Alias "WNetAddConnectionA" (ByVal lpszNetPath As String, ByVal lpszPassword As String, ByVal lpszLocalName As String) As Long
Private Declare Function WNetCancelConnection Lib "mpr.dll" Alias "WNetCancelConnectionA" (ByVal lpszName As String, ByVal bForce As Long) As Long
Function AddConnection(shareName As String, pwd As String, localLetter As String) As Boolean
'Если успешно то NO_ERROR. Если функция терпит неудачу, то возвращается одно из следующих значений:
'ERROR_ACCESS_DENIED - Нет доступа к сетевому ресурсу.
'ERROR_ALREADY_ASSIGNED - Устройство указанное в параметре lpLocalName уже переопределено.
'ERROR_BAD_DEV_TYPE - Тип устройства и тип ресурса не сочетается.
'ERROR_BAD_DEVICE - Значение определенное в параметре lpLocalName неверно.
'ERROR_BAD_NET_NAME - Значение определенное в параметре lpRemoteName неверно.
'
'ERROR_BAD_PROFILE - Профиль пользователя неправильного формата.
'ERROR_CANNOT_OPEN_PROFILE - Система не может открыть профиль пользователя.
'ERROR_DEVICE_ALREADY_REMEMBERED - Прявязка для устройства указнного в параметре lpLocalName - уже в профиле пользователя.
'ERROR_EXTENDED_ERROR - Произошла сетевая спецефическая ошибка. Для того чтобы получить информацию об ошибке, вызовите функцию WNetGetLastError.
'ERROR_INVALID_PASSWORD - Пароль недействителен.
'
'ERROR_NO_NET_OR_BAD_PATH - Операция не выполнена потому что сетевой компонент не запущен или имя сетевого ресурса не может быть использовано.
'ERROR_NO_NETWORK - Сеть отсутствует.
'Параметры:
'[lpRemoteName] - cтрока, определяющая удаленный сетевой ресурс для соединения.
'[lpPassword] - cтрока, которая определяет пароль, для аутентификации. Если этот параметр nil,
' то используется пароль по умолчанию, если строка пустая,
' то пароль не используется.
' Win 95/98/Me: Этот параметр должен быть nil или пустой строкой.
'[lpLocalName] - cтрока которая определяет имя локального устройства, которое нужно переназначить.
' Например "F:" ли "LPT1". Если строка равна nil, то
' локальный ресурс не переназначается.
On Local Error GoTo AddConnection_Err
AddConnection = WNetAddConnection(shareName, pwd, localLetter)
AddConnection = True
AddConnection_End:
Exit Function
AddConnection_Err:
Select Case Err.Number
Case ERROR_ACCESS_DENIED
'.
Case Else
'.
End Select
AddConnection = False
Resume AddConnection_End
End Function
Function CancelConnection(localLetter As String, force As Integer) As Boolean
On Local Error GoTo CancelConnection_Err
CancelConnection = WNetCancelConnection(localLetter, force)
CancelConnection = True
CancelConnection_End:
Exit Function
CancelConnection_Err:
CancelConnection = False
MsgBox Error$
Resume CancelConnection_End
End Function
Originally posted by pnvnik
Да, актуально! Из командной строки типа net use не годится. Пример с WinAPI тоже подойдет (особенно если с комментариями:)). Надо програмно отключить/подключить сетевой диск/ресурс (не принтер). Если есть пример без API - еще лучше!
А через SHELL на VB/VBA не подойдет?
типа
shell "net use z: \\srvbdc6\catalog"
Private Declare Function WNetAddConnection Lib "mpr.dll" Alias "WNetAddConnectionA" (ByVal lpszNetPath As String, ByVal lpszPassword As String, ByVal lpszLocalName As String) As Long
Private Declare Function WNetCancelConnection Lib "mpr.dll" Alias "WNetCancelConnectionA" (ByVal lpszName As String, ByVal bForce As Long) As Long
Function AddConnection(shareName As String, pwd As String, localLetter As String) As Boolean
'Если успешно то NO_ERROR. Если функция терпит неудачу, то возвращается одно из следующих значений:
'ERROR_ACCESS_DENIED - Нет доступа к сетевому ресурсу.
'ERROR_ALREADY_ASSIGNED - Устройство указанное в параметре lpLocalName уже переопределено.
'ERROR_BAD_DEV_TYPE - Тип устройства и тип ресурса не сочетается.
'ERROR_BAD_DEVICE - Значение определенное в параметре lpLocalName неверно.
'ERROR_BAD_NET_NAME - Значение определенное в параметре lpRemoteName неверно.
'
'ERROR_BAD_PROFILE - Профиль пользователя неправильного формата.
'ERROR_CANNOT_OPEN_PROFILE - Система не может открыть профиль пользователя.
'ERROR_DEVICE_ALREADY_REMEMBERED - Прявязка для устройства указнного в параметре lpLocalName - уже в профиле пользователя.
'ERROR_EXTENDED_ERROR - Произошла сетевая спецефическая ошибка. Для того чтобы получить информацию об ошибке, вызовите функцию WNetGetLastError.
'ERROR_INVALID_PASSWORD - Пароль недействителен.
'
'ERROR_NO_NET_OR_BAD_PATH - Операция не выполнена потому что сетевой компонент не запущен или имя сетевого ресурса не может быть использовано.
'ERROR_NO_NETWORK - Сеть отсутствует.
'Параметры:
'[lpRemoteName] - cтрока, определяющая удаленный сетевой ресурс для соединения.
'[lpPassword] - cтрока, которая определяет пароль, для аутентификации. Если этот параметр nil,
' то используется пароль по умолчанию, если строка пустая,
' то пароль не используется.
' Win 95/98/Me: Этот параметр должен быть nil или пустой строкой.
'[lpLocalName] - cтрока которая определяет имя локального устройства, которое нужно переназначить.
' Например "F:" ли "LPT1". Если строка равна nil, то
' локальный ресурс не переназначается.
On Local Error GoTo AddConnection_Err
AddConnection = WNetAddConnection(shareName, pwd, localLetter)
AddConnection = True
AddConnection_End:
Exit Function
AddConnection_Err:
Select Case Err.Number
Case ERROR_ACCESS_DENIED
'.
Case Else
'.
End Select
AddConnection = False
Resume AddConnection_End
End Function
Function CancelConnection(localLetter As String, force As Integer) As Boolean
On Local Error GoTo CancelConnection_Err
CancelConnection = WNetCancelConnection(localLetter, force)
CancelConnection = True
CancelConnection_End:
Exit Function
CancelConnection_Err:
CancelConnection = False
MsgBox Error$
Resume CancelConnection_End
End Function
К примеру, приведенному SergeySV, могу предложить некоторые замечания.
1. Функция WNetAddConnection ориентирована на 16-разрядный API. Для 32-разрядного лучше использовать WNetAddConnection2
(описание см. ниже). Для ее нормальной работы нужно описать структуру NETRESOURCE (см. ниже).
2. В доменных сетях на базе Windows NT/2000/XP для отключения сетевого ресурса лучше использовать функцию WNetCancelConnection2.
У нее (в отличие от WNetCancelConnection) есть флаг, позволяющий указать, надо ли обновить профиль пользователя после отключения ресурса.
Если не обновлять профиль, то при следующей загрузке компьютера отключенный ресурс опять будет доступен.
1. Объявляем структуру данных
Private Type NetResource
dwScope As Long
dwType As Long 'Тип ресурса: дисковый или принтер
dwDisplayType As Long
dwUsage As Long
lpLocalName As String 'Локальное имя ресурса, например, "x:"
lpRemoteName As String 'Сетевое имя ресурса, например, "\\server\d$"
lpComment As String
lpProvider As String 'Системный провайдер, обеспечивающий собственно подключение, например, "LDAP:"
End Type
Примечание.
Системный провайдер - компонент ОС Windows. Он отвечает за работу в соответствующем пространстве имен сетевых объектов.
Если это значение не задавать, то будет выбран провайдер, действующий по умолчанию (что и рекомендую).
2. Объявляем функции из комплекта Win32 API.
Private Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" (lpNetResource As NetResource, ByVal strPassword As String, ByVal strUserName As String, ByVal lngFlags As Long) As Long
Private Declare Function WNetCancelConnection2 Lib "mpr.dll" Alias "WNetCancelConnection2A" (ByVal lpName As String, ByVal dwFlags As Long, ByVal fForce As Long) As Long
3. Описываем пользовательские функции подключения и отключения ресурса.
Function AddConnection(strNetPath As String, strLocalName As String, strUserName As String, strPwd As String, Optional fPersistent As Boolean = True, Optional fDisk As Boolean = True) As Long
'Переменная fPersistent - флаг режима обновления профиля пользователя: обновлять или нет,
'по умолчанию - обновлять (значение TRUE)
'Переменная fDisk - флаг типа сетевого ресурса (диск или принтер), по умолчанию - диск (значение TRUE)
Dim usrNetResource As NetResource
Dim lngFlags As Long
With usrNetResource
.dwType = IIf(fDisk, dhcResourceTypeDisk, dhcResourceTypePrint) 'Определяем тип ресурса
'dhcResourceTypeDisk и dhcResourceTypePrint - стандартные константы функции WNetCancelConnection2
.lpLocalName = strLocalName
.lpRemoteName = strNetPath
.lpProvider = vbNullString
End With
'Задаем режим обновления профиля
lngFlags = IIf(fPersistent, dhcConnectUpdateProfile, dhcConnectDontUpdateProfile)
'Подключаемся к указанному ресурсу
AddConnection = WNetAddConnection2(usrNetResource, strPwd, strUserName, lngFlags)
Function CancelConnection(strLocalName As String, Optional forceDisconnect As Boolean = False, Optional updateUserProfile As Boolean = True) As Long
'Переменная forceDisconnect - флаг режима отключения ресурса: безусловный или нет, по умолчанию - не безусловный (FALSE)
'Безусловный режим - ресурс будет отключен, даже если есть открытые с отключаемого ресурса файлы
'Не безусловный режим - ресурс не будет отключен, если есть открытые с отключаемого ресурса файлы
Dim lngFlags As Long
'Задаем режим обновления профиля (обновлять или нет)
lngFlags = IIf(updateUserProfile, dhcConnectUpdateProfile, dhcConnectDontUpdateProfile)
'Отключаемся от ресурса
CancelConnection = WNetCancelConnection2(strLocalName, lngFlags, Abs(forceDisconnect))
4. Проверяем работу функций подключения/отключения
Sub TestNetConnect()
Dim cntResult As Long
cntResult = AddConnection("\\server\c$", "Q:", "Администратор", "")
End Sub
Sub TestNetDisconnect()
Dim cntResult As Long
cntResult = CancelConnection("Q:")
End Sub
Здравствуйте. Ситуация следующая. Имеется доменная локальная сеть под управлением Windows server 2003. В этой сети файловый сервер на Windows server 2003 с ip типа 10.*.*.* . Удаленно через NAT подключены несколько рабочих станций с Windows XP и Windows 98 объедененные в рабочую группу, соответственно они не в домене. В домене заведен пользователь (например User) с паролем (например Pasword). Возникла необходимость программно подключить-отключить сетевой диск расположенный на файловом сервере без участия пользователя, т.е. чтобы пользователь не вводил вручную имя и пароль. Адрес файлового сервера после преобразования NAT маршрутизатором с адреса 10.*.*.* стал 172.*.*.* .
Я нашел одно решение, сделал по шаблону, но. с Windows XP все работает нормально, а с WIndows 98 проблемка. Выдает ошибку "Acces Denied". Когда испробовал код на рабочей станции WIndows 98 входящей в домен, то диски подключаются и отключаются. Я не силен в программировании, тем более если касается функций Windows API. Может кто подскажет в чем ошибка?
Вот образац фрагмента кода на VISUAL BASIC 6.0.
Option Explicit
Public Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" (lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUsername As String, ByVal dwFlags As Long) As Long
Public Declare Function WNetCancelConnection2 Lib "mpr.dll" Alias "WNetCancelConnection2A" (ByVal lpName As String, ByVal dwFlags As Long, ByVal fForce As Long) As Long
Public ErrorNum As Long
Public ErrorMsg As String
Public rc As Long
Public RemoteName As String
Public Const ERROR_BAD_DEV_TYPE = 66&
Public Const ERROR_ALREADY_ASSIGNED = 85&
Public Const ERROR_ACCESS_DENIED = 5&
Public Const ERROR_BAD_NET_NAME = 67&
Public Const ERROR_BAD_PROFILE = 1206&
Public Const ERROR_BAD_PROVIDER = 1204&
Public Const ERROR_BUSY = 170&
Public Const ERROR_CANCEL_VIOLATION = 173&
Public Const ERROR_CANNOT_OPEN_PROFILE = 1205&
Public Const ERROR_DEVICE_ALREADY_REMEMBERED = 1202&
Public Const ERROR_EXTENDED_ERROR = 1208&
Public Const ERROR_INVALID_PASSWORD = 86&
Public Const ERROR_NO_NET_OR_BAD_PATH = 1203&
Public Const ERROR_NO_NETWORK = 1222&
Public Const ERROR_NO_CONNECTION = 8
Public Const ERROR_NO_DISCONNECT = 9
Public Const ERROR_DEVICE_IN_USE = 2404&
Public Const ERROR_NOT_CONNECTED = 2250&
Public Const ERROR_OPEN_FILES = 2401&
Public Const ERROR_MORE_DATA = 234
Public Const CONNECT_UPDATE_PROFILE = &H1
Public Const RESOURCETYPE_DISK = &H1
Public Type NETRESOURCE
dwScope As Long
dwType As Long
dwDisplayType As Long
dwUsage As Long
lpLocalName As String
lpRemoteName As String
lpComment As String
lpProvider As String
End Type
Public lpNetResourse As NETRESOURCE
Public Sub Connect(ByVal HostName As String, ByVal RemoteName As String, ByVal Username As String, ByVal Password As String)
Dim lpUsername As String
Dim lpPassword As String
On Error GoTo Err_Connect
ErrorNum = 0
ErrorMsg = ""
lpNetResourse.dwType = RESOURCETYPE_DISK
lpNetResourse.lpLocalName = RemoteName & Chr(0)
'Drive Letter to use
lpNetResourse.lpRemoteName = "\\" & HostName & Chr(0)
'Network Path to share
lpNetResourse.lpProvider = Chr(0)
lpPassword = Password & Chr(0)
'password on share pass "" if none
lpUsername = Username & Chr(0)
'username to connect as if applicable
rc = WNetAddConnection2(lpNetResourse, lpPassword, lpUsername, CONNECT_UPDATE_PROFILE)
If rc <> 0 Then GoTo Err_Connect
Exit Sub
Err_Connect:
ErrorNum = rc
ErrorMsg = WnetError(rc)
End Sub
Public Sub DisConnect(ByVal Name As String, ByVal ForceOff As Boolean)
On Error GoTo Err_DisConnect
ErrorNum = 0
ErrorMsg = ""
rc = WNetCancelConnection2(Name & Chr(0), CONNECT_UPDATE_PROFILE, ForceOff)
If rc <> 0 Then GoTo Err_DisConnect
Exit Sub
Err_DisConnect:
ErrorNum = rc
ErrorMsg = WnetError(rc)
End Sub
Private Function WnetError(Errcode As Long) As String
Select Case Errcode
Case ERROR_BAD_DEV_TYPE
WnetError = "Bad device."
Case ERROR_ALREADY_ASSIGNED
WnetError = "Already Assigned."
Case ERROR_ACCESS_DENIED
WnetError = "Access Denied."
Case ERROR_BAD_NET_NAME
WnetError = "Bad net name"
Case ERROR_BAD_PROFILE
WnetError = "Bad Profile"
Case ERROR_BAD_PROVIDER
WnetError = "Bad Provider"
Case ERROR_BUSY
WnetError = "Busy"
Case ERROR_CANCEL_VIOLATION
WnetError = "Cancel Violation"
Case ERROR_CANNOT_OPEN_PROFILE
WnetError = "Cannot Open Profile"
Case ERROR_DEVICE_ALREADY_REMEMBERED
WnetError = "Device already remembered"
Case ERROR_EXTENDED_ERROR
WnetError = "Device already remembered"
Case ERROR_INVALID_PASSWORD
WnetError = "Invalid Password"
Case ERROR_NO_NET_OR_BAD_PATH
WnetError = "Could not find the specified device"
Case ERROR_NO_NETWORK
WnetError = "No Network Present"
Case ERROR_DEVICE_IN_USE
WnetError = "Connection Currently in use "
Case ERROR_NOT_CONNECTED
WnetError = "No Connection Present"
Case ERROR_OPEN_FILES
WnetError = "Files open and the force parameter is false"
Case ERROR_MORE_DATA
WnetError = "Buffer to small to hold network name, make lpnLength bigger"
Case Else:
WnetError = "Unrecognized Error " + Str(Errcode) + "."
End Select
End Function
Option Explicit
Private Sub Command1_Click() ' подключение диска
Call Module1.Connect("172.*.*.*\shara", "R:", "имя_пользователя@имя_домена.local", "Pasword")
If (Module1.rc <> 0) And (Module1.rc <> 85) Then
MsgBox Module1.ErrorMsg
End If
End Sub
Private Sub Command2_Click() ' отключение диска
Call Module1.DisConnect("R:", True)
If (Module1.rc <> 0) And (Module1.rc <> 85) Then
MsgBox Module1.ErrorMsg
End If
End Sub
Dim nameOfTxtFile As String
nameOfTxtFile = "\\lib\SemHR\SystemFiles\course.txt"
Спасибо вам за ответ.
1,3. Код ошибки, к сожалению, я не зафиксировал. Собираюсь завтра (01.04.06) проверить работоспособность дескриптора FreeFile. В этот же день (примерно к 17:00) я напишу о результатах его применения в решении моей задачи и укажу код ошибки.
2. На клиентских машинах установлена программа MS Office 2002.
Еще раз большое спасибо за подсказку!
Это Вы так называете Office XP или это официальное название? Мне что-то не встречался такой вариант.
Под программой "Office XP" я имел ввиду общеизвестный текстовый редактор "Microsoft Word" (сожалею о допущенной неточности в названии). Сочетание "XP" было использовано в письме для указания версии этой программы. Скрипты были написаны средствами встроенного в редактор "Microsoft Word" версии XP программного языка "Visual Basic". А затем, запущены на клиентской машине, где установлена версия программы (текстового редактора) "Microsoft Word" версии 2002.
Важным дополнение к моему вопросу может быть следующее:
если зайти на клиентскую машину под паролем администратора, имеющего доступ на чтение и запись в соответствующей сетевой папке "\\lib\SemHR\", то никаких проблем при работе скрипта не возникает. Но при отсутствии прав у пользователя на запись информации в этой папке возникает вышеуказанная ошибка. В самом скрипте нет команд записи. Обращение к сетевому файлу "txt" осуществляеться только один раз для считывания информации из него.
К сожалению, при тестировании скрипта с дескриптором FreeFile на клиентской машине с правами только на чтение сетевой папки возникает прежняя ошибка. Ее полный текст следующий:
Originally posted by Bluebird
. если зайти на клиентскую машину под паролем администратора, имеющего доступ на чтение и запись в соответствующей сетевой папке "\\lib\SemHR\", то никаких проблем при работе скрипта не возникает. Но при отсутствии прав у пользователя на запись информации в этой папке возникает вышеуказанная ошибка. В самом скрипте нет команд записи. Обращение к сетевому файлу "txt" осуществляеться только один раз для считывания информации из него.
. при тестировании скрипта с дескриптором FreeFile на клиентской машине с правами только на чтение сетевой папки возникает прежняя ошибка.
1. Хотелось бы увидеть весь текст макроса или, по крайней мере, ту часть, что предшествует оператору открывания файла "txt".
2. Для более-менее корректного моделирования ситуация нужны "сетевые" подробности.
2.1. Ваша сеть представляет собой домен или одноранговую сеть?
2.2. Какая ОС используется на сервере, и какая файловая система - на диске с данным сетевым ресурсом?
2.3. Каким образом регулируются права доступа клиентов к ресурсу:
- разрешения настроены с помощью вкладки "Доступ";
- разрешения настроены с помощью вкладки "Безопасность";
- первое и второе сочетаются (как именно).
2.4. Используется ли для предоставления доступа к данному сетевому ресурсу DFS?
3. Используется ли на рабочих станциях антивирус DrWeb версии 4.33?
Dmitrii, большое спасибо вам за поддержку.
На ваши вопросы постараюсь ответить до 5 апреля (включительно). Т.е. вечером 5 апреля к 21:00.
Макрос, над который я пытаюсь внедрить является компонентом написанной мною тестовой системы для студентов.
В момент создания тестовой системы системный администратор негативно относился к запускаемым на факультетских машинах файлам типа "exe".
Поэтому я решил создать программу, запускаемую средствами "MS Office" через броузер "Internet Explorer".
Мой макрос размещен в следующем месте проекта (в структуре макросов): "Project/Modules/Module1".
Его код следующий:
-------------------------------------
' Создание общедоступных (глобальных) переменных
Public FIO, currentFormEducation, questionAnswers(20, 20, 20), currentDirectory As String
Public currentTrueAnswers(20, 20, 20), numberCurrentAnswers(20, 20), numberCurrentQuestions(20), currentQuestion, currentTheme As Integer
Public maxTrueAnswers, numberTrueAnswers, numberFalseAnswers, numberPossibleFalseAnswers As Integer
Public numberAskedThemes, NumberThemes(50) As Integer
Public mark As Integer
Public courseFile(50) As String
Public answers(20, 20, 20) As Boolean
Sub autoopen()
' Установка нулевых значений на глобальные переменные
Dim i, j, k As Integer
numberAskedThemes = 0
FIO = ""
currentFormEducation = ""
currentQuestion = 0
For i = 0 To 20
For j = 0 To 20
numberCurrentAnswers(i, j) = 0
For k = 0 To 20
currentTrueAnswers(i, j, k) = 0
answers(i, j, k) = False
questionAnswers(i, j, k) = ""
Next k
Next j
Next i
' Выход из режима с конструктором
CommandBars("Control Toolbox").Visible = False
' Считывание информации из файла
Dim Directory, inputData As String
Dim courseName(50), lecturerName(50) As String
Dim controlQuantity(50), numberFiles As Integer
Dim controlQuantityPermit As Boolean
For i = 1 To 50
controlQuantity(i) = 0
Next i
controlQuantityPermit = True
numberFiles = 0
'. _Проверка наличия файла с курсом на диске (к сожалению, данный кусок кода (выделенный значками "'") в ситуации появления ошибки "Run-time error '75': Path/File access error" ищет текстовые файлы на диске "C:" клиентской машины (на которой запускается макрос))
' Directory = "\\lib\SemHR\SystemFiles"
' currentDirectory = "\\lib\SemHR"
' Dim fileExist As Boolean
' fileExist = False
' Set fs = Application.FileSearch
' With fs
' .LookIn = Directory
' .FileName = "*.txt"
' If .Execute > 0 Then
' fileExist = True
' End If
' For i = 1 To .FoundFiles.Count
' courseFile(i) = .FoundFiles(i)
' Next i
' numberFiles = .FoundFiles.Count
' End With
courseFile(1) = "\\lib\SemHR\SystemFiles\course.txt"
'. _Количество текстовых файлов я сделал равным 1, так как их поиск не работает корректно (код выше, отмеченный знаками "'")
numberFiles = 1
'. _Здесь происходит начало работы с дескриптором "FreeFile"
Dim hFile As Long
hFile = FreeFile
' Проверка наличия исходных файлов
If fileExist = True Then
' Проверка количества исходных файлов
If numberFiles
For i = 1 To numberFiles
NumberThemes(i) = 0
'. _Здесь происходит считывание файла "txt"
Open courseFile(i) For Input Access Read As hFile
' Определение максимального количества тем для тестирования
If InStrRev(inputData, "&", , 1) <> 0 Then
NumberThemes(i) = NumberThemes(i) + 1
End If
' Вычленение названия курса и ФИО преподавателя
If controlQuantity(i) = 1 Then
symbolPosition = InStrRev(inputData, "^", , 1)
inputData = Right(inputData, Len(inputData) - symbolPosition)
courseName(i) = inputData
End If
If controlQuantity(i) = 2 Then
symbolPosition = InStrRev(inputData, "^", , 1)
inputData = Right(inputData, Len(inputData) - symbolPosition)
lecturerName(i) = inputData
End If
Loop
Close hFile
Next i
' Проверка наличия
For i = 1 To 50
If controlQuantity(i) > 2000 Then
controlQuantityPermit = False
End If
Next i
If controlQuantityPermit = True Then
' Загрузка формы приветствия
Load GreetingForm
' Начальная установка формы обучения
GreetingForm.FormEducation.AddItem "Студент(ка) 3 курса"
GreetingForm.FormEducation.AddItem "Студент(ка) 4 курса"
GreetingForm.FormEducation.AddItem "Студент(ка) 5 курса"
GreetingForm.FormEducation.AddItem "Аспирант(ка) 1 г/о"
GreetingForm.FormEducation.AddItem "Аспирант(ка) 2 г/о"
GreetingForm.FormEducation.AddItem "Аспирант(ка) 3 г/о"
GreetingForm.FormEducation.AddItem "Отличная от предложенных"
GreetingForm.FormEducation.ListIndex = 0
' Начальная установка названия курса
For i = 1 To numberFiles
GreetingForm.TestCourseName.AddItem courseName(i) & " (составитель " & lecturerName(i) & ")"
Next i
GreetingForm.TestCourseName.ListIndex = 0
' Начальная установка количество тем для выбора
For i = 1 To NumberThemes(1)
GreetingForm.ThemesNumber.AddItem i
Next i
GreetingForm.ThemesNumber.ListIndex = 0
' Показать форму приветствия
GreetingForm.Show
Else
MsgBox "Корректное прочтение исходных файлов невозможно, так как один из исходных файлов с вопросами содержит слишком большое количество информации (более 2000 строк)!"
ActiveWindow.Close (0)
End If
Else
End If
Else
MsgBox "Прохождение теста невозможно, так как отсутствует один из исходных файлов!"
ActiveWindow.Close (0)
End If
End Sub
-------------------------------------
Пытаюсь сопоставить букву сетевого диска. Рабочий код показан ниже. См. Последнюю функцию, функцию xxx. Это мой код драйвера. Это тот, которым я управляю.
Размагничивание работает. Отображение не работает.
Всегда возвращает false, означает, что сопоставление никогда не выполняется. Указанные имя пользователя, пароль и путь кажутся точными. Любые идеи?
Вот код драйвера:
Не работает означает, что следующий код всегда возвращает false: MapDrive = (WNetAddConnection2 (NetR, Username, Password, _ CONNECT_UPDATE_PROFILE) = 0)
Heap of Pinto Beans
К вашему сведению, ваша функция unmap - это в основном шум. Он заполняет участников NetR, но никогда не использует NetR. Вся функция может быть сокращена до двух последних строк и по-прежнему работать.
Любопытно . Код работает у кого-нибудь? Я имею в виду, скопируйте и вставьте его и измените пароль и путь имени пользователя, это работает? .
Heap of Pinto Beans
Heap of Pinto Beans
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно.
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей.
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то.
Вместо этого попробуйте этот метод:
Пример использования:
Другие вопросы по теме
Как я могу использовать настраиваемые теги XML / определяемые пользователем в .pptx /.pptm, чтобы PowerPoint 2013 не стирал его?
Как отобразить информацию (полученную из другой таблицы) о n элементах в отчете с запросом в качестве источника управления?
Больше информации:
я пробовал ваш код. Он всегда говорит: «Имя сети не может быть найдено».
Heap of Pinto Beans
а вы используете UNC-путь, например "\\server\path\sharename\" ? Если да, то что произойдет, если вы нажмете [Windows Key]+R и вставите туда свой путь? Он должен запросить имя пользователя и пароль, а затем открыть папку, правильно?
@HeapofPintoBeans Вы нашли решение этой ошибки?
ПРОСТО КОПИРУЙТЕ ЭТО В НОВЫЙ МОДУЛЬ .
Heap of Pinto Beans
Похожие вопросы
Находите ответы на сложные технические вопросы по программированию, с которыми сталкиваются инженеры по всему миру в своей ежедневной практике на сайте RedDeveloper.
Ответы 3
Вы передаете идентификатор пользователя и пароль в неправильном порядке. В вашем определении:
А потом в вашем звонке:
Исходя из объявления, пароль должен предшествовать имени пользователя.
Кроме того, ваша процедура отмены сопоставления удваивает двоеточие на диске, но, по-видимому, это не должно влиять на результат, поскольку вы сказали, что это работает.
Хорошее наблюдение. Я изменил свою логику, но других результатов не добился. Я изменил строку на: MapDrive = (WNetAddConnection2 (NetR, Пароль, Имя пользователя, _ CONNECT_UPDATE_PROFILE) = 0)
Heap of Pinto Beans
Я вижу пару проблем с вашим кодом и думаю, что есть более простой и надежный метод программного сопоставления диска.
Читайте также: