Форум » [x]Harbour » "Висящий" процесс » Ответить

"Висящий" процесс

fil: Всем привет ! На компе открыт Exel. В некоторой ситуации он падает (в смысле окна нет, а процесс висит) Если в Excel был открыт файл общего доступа, то он блокируется на запись. Моя прога резидентно перехватывает висящие процессы и удаляет их. Можно ли определить открывался файл данным Excel или нет ?

Ответов - 3

AlexMyr: fil пишет: Моя прога резидентно перехватывает висящие процессы Это на harbour? fil пишет: Можно ли определить открывался файл данным Excel или нет ? может использовать Process Monitor

santy: fil пишет: На компе открыт Exel. В некоторой ситуации он падает (в смысле окна нет, а процесс висит) Если в Excel был открыт файл общего доступа, то он блокируется на запись. Моя прога резидентно перехватывает висящие процессы и удаляет их. Можно ли определить открывался файл данным Excel или нет ? ЕСли в данный момент нужно определить занят чи файл excel то надо открыть excel и проверить [pre2] Private Sub Workbook_Open() If ActiveWorkbook.ReadOnly Then msgbox "Открыта только для чтения" End If End Sub [/pre2] тогда впринципе можно макрос написать, который через API-вызов например вычитывал бы имя машины/Login name/IPшник из системного реестра запустившего пользователя. И складывать их например в Workbook.Property. Или на отдельный worksheet. штука реально полезная и интересная. реализовал так, вставляю во все отчеты =))) пихаем это в Книгу Private Sub Workbook_Open() 'ведение лога UserLog End Sub непосредственно код в модуле Private Declare Function GetComputerNameA Lib "kernel32" (ByVal lpBuffer As String, nSize As Long) As Long Private Declare Function WNetGetUserA Lib "mpr.dll" (ByVal lpName As String, ByVal lpUserName As String, lpnLength As Long) As Long 'сетевое имя компьютера Function GetComputerName() As String Dim sBuffer As String * 255 If GetComputerNameA(sBuffer, 255&) <> 0 Then GetComputerName = Left$(sBuffer, InStr(sBuffer, vbNullChar) - 1) End If End Function 'имя пользователя Function GetUserName() As String Dim sUserNameBuff As String * 255 sUserNameBuff = Space(255) Call WNetGetUserA(vbNullString, sUserNameBuff, 255&) GetUserName = Left$(sUserNameBuff, InStr(sUserNameBuff, vbNullChar) - 1) End Function 'запись в лог-файл Sub UserLog() Dim nLogtxt As String nLogtxt = "G:\PROJECTS\LogData" & "\" & Replace(ThisWorkbook.Name, ".xls", ".txt") Open nLogtxt For Append As #1 Print #1, Application.UserName & " -- " & Now & " -- " & GetComputerName & " -- " & GetUserName Close #1 End Sub хорошо ещё ставить на событие сохранения книги процедуру программного скрытия всех листов, чтобы у пользователя не оставалось шансов, кроме включения макросов. одновременно с этим в тихую дать пользователям доситуп к какой-нить незаметной папочке, где всё это будет вестись... Можно взять утилиты командной строки : Windows Sysinternals Есть неплохая утилита Unlocker вики unlocker Похожая lockhunter lockhunter OPENFILES /<параметр> [<аргументы>] Описание: Эта команда позволяет администратору вывести список открытых файлов и папок, которые были открыты в системе. Список параметров: /Disconnect Отключение одного и более открытых файлов. /Query Отображение открытых файлов, локально и с сетевого ресурса. /Local Включает/отключает отображение локально открытых файлов. Примечание: Включение отображения локально открытых файлов приводит к снижению производительности системы. Примеры: OPENFILES /Disconnect /? OPENFILES /Query /? OPENFILES /Local /?

fil: Спасибо за советы (тока до компа добрался). Я заранее не знаю какой .XLS файл будет использоваться Можно ли определить находится ли приложение в процессе загрузки (в данном случае Excel) Т.к. я ориентируюсь на наличие окна у процесса, то загружаемое и висящее приложение для меня одно и тоже




полная версия страницы