Здравствуйте, agendus, Вы писали:
A>CmdLine = "excel " & Chr(34) & fName & Chr(34) & A>[/vb], так сделано уже — закавычил Кстати, засада может быть в том, что имя файла с пробелами?
Кавычат, конечно, не так, но — не суть дела.
Во-первых, SInfo нуждается в инициализации.
Во-вторых, что за "excel" — в общем случае нужен полный путь (как правило, закавычен).
В-третьих, есть такая функция GetLastError — ее нужно анализировать в соотв. с msdn.
В-четвертых, два раза прочитал "потому, что у ТЕКУЩЕГО пользователя доступа к директории и файлу НЕТ!
Доступ только у пользователя, под которым открывается Excel" — и ничего не понял.
Дык, это, что же, клиенты терминал-сервера?
Здравствуйте, Leonid Troyanovsky, Вы писали:
LT>Здравствуйте, agendus, Вы писали:
A>>CmdLine = "excel " & Chr(34) & fName & Chr(34) & A>>[/vb], так сделано уже — закавычил Кстати, засада может быть в том, что имя файла с пробелами?
LT>Кавычат, конечно, не так, но — не суть дела.
LT>Во-первых, SInfo нуждается в инициализации. LT>Во-вторых, что за "excel" — в общем случае нужен полный путь (как правило, закавычен). LT>В-третьих, есть такая функция GetLastError — ее нужно анализировать в соотв. с msdn.
LT>В-четвертых, два раза прочитал "потому, что у ТЕКУЩЕГО пользователя доступа к директории и файлу НЕТ! LT>Доступ только у пользователя, под которым открывается Excel" — и ничего не понял. LT>Дык, это, что же, клиенты терминал-сервера?
Спасибо за детальный ответ.
Начну с конца — подробней и проще опишу задачу. У сотрудников запрещен доступ к некоторым корпоративным файлам, но... информацию оттуда надо получать. Завели специальную учетку, под которой возможен доступ к секретным директориям и файлам. По идее, нажали кнопку — запускается открытие файла под этой учеткой (в скрытом режиме — люди ничего не увидят), считываются данные и файл закрывается. Все!
Я уже указываю полный путь к Excel.
Насчет инициализации. В С++ можно ZeroMemory и пр. А как в VB инициализировать структуру (как я понимаю нужно ее обнулить, так как потом я задаю значения некоторых полей)?
Раз я пишу на VBA в Excel, а не в IDE Visual Basic, мне придется создавать класс наподобие ProcessStartInfo, так ведь? Определить все поля, методы, указать что методы импортировать из System.dll.
Или как еще импортировать класс можно? Пробовал
Public Declare Class ProcessStartInfo Lib"System.dll"
В-третьих, есть такая функция GetLastError — ее нужно анализировать в соотв. с msdn.
Было бы чего анализировать — при выполнении моего кода ошибки то не происходит — процесс (Excel) успешно запускается. А уже в нем файл нужный не открывается
Res = CreateProcessWithLogonW(StrPtr(sUsername), StrPtr(sDomain), StrPtr(sPwd), _
LOGON_NETCREDENTIALS_ONLY, _
0&, StrPtr(sCmd), _
0&, _
ByVal 0&, _
StrPtr(sDir), _
SInfo, PInfo)
If Res <> 0 Then' 'я попадаю сюда - все ОК!!!
hProcess = PInfo.hProcess
ProcID = PInfo.dwProcessId
If Wait Then
If WaitForSingleObject(PInfo.hProcess, _
Timeout) = WAIT_TIMEOUT Then
RunAs = WAIT_TIMEOUT
If Terminate Then
If TerminateProcess(PInfo.hProcess, 0) = 0 Then
RunAs = Err.LastDllError
End If
End If
End If
End If
Else
RunAs = Err.LastDllError
MsgBox GetErrorMessage(RunAs)
hProcess = 0
ProcID = 0
End If
Здравствуйте, agendus, Вы писали:
A>Раз я пишу на VBA в Excel, а не в IDE Visual Basic, мне придется создавать класс наподобие ProcessStartInfo, так ведь? Определить все поля, методы, указать что методы импортировать из System.dll. A>Или как еще импортировать класс можно? Пробовал A>
A>Public Declare Class ProcessStartInfo Lib"System.dll"
A>
, но так нельзя.
Тогда попробуйте в CreateProcessWithLogonW заменить LOGON_NETCREDENTIALS_ONLY на LOGON_WITH_PROFILE