Chirurgia spinală minim invazivă
Chirurgia spinală minim invazivă oferă pacienților oportunitatea unui tratament eficient, permițându-le o recuperare ultra rapidă și nu în ultimul rând minimizând leziunile induse chirurgical. Echipa noastră utilizează un spectru larg de tehnici minim invazive, din care enumerăm câteva: endoscopia cu variantele ei (transnazală, transtoracică, transmusculară, etc), microscopul operator, abordurile trans tubulare și nu în ultimul rând infiltrațiile la toate nivelurile coloanei vertebrale. www.neurohope.ro |
Calea unui fisier deschis
Last Updated: Jun 26 2006 13:20, Started by
Xcutioner
, Jun 23 2006 09:39
·
0
#1
Posted 23 June 2006 - 09:39
Cum se poate afla calea unui fisier deschis. De ex. e deschis un fisier Notpad de catre utilizator nu de catre programul meu care are in bara "Masini - Notepad" . Cum pot afla calea acestui fisier daca el este deschis de pe desktop sau din alta parte.
|
#2
Posted 23 June 2006 - 10:24
Xcutioner, on Jun 23 2006, 10:39, said: Cum se poate afla calea unui fisier deschis. De ex. e deschis un fisier Notpad de catre utilizator nu de catre programul meu care are in bara "Masini - Notepad" . Cum pot afla calea acestui fisier daca el este deschis de pe desktop sau din alta parte. Nu cred ca am inteles ce vrei. Incerci sa afli calea unui fisier deschis dintr-un proces sau daca o aplicatie deschisa pe desktop este deschisa de aplicatia ta sau de catre utilizator? |
#4
Posted 26 June 2006 - 12:11
Trebuie sa monitorizezi procesele deschise si sa afli calea catre executabile.
E putin mai complicat, dar functioneaza in felul urmator (codul de mai jos este pentru Windows NT and up, daca e nevoie pt Windows 98 se folosesc alte functii API, gen CreateToolhelp32Snapshot). Bine, daca iti arunci ochii mai atent vei observa ca o data ce ai reusit sa preiei handle-ul unui proces poti face mult mai multe cu el : 1. Creaza un nou proiect Standard EXE si adauga un modul, sa zicem Module1. In modul adauga urmatorul cod: Option Explicit Private Declare Function EnumProcesses Lib "psapi" (lpIdProcess As Any, ByVal cb As Long, cbNeeded As Long) As Long Private Declare Sub CloseHandle Lib "kernel32" (ByVal hPass As Long) Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long Private Declare Function GetModuleBaseName Lib "PSAPI.DLL" Alias "GetModuleBaseNameA" (ByVal hProcess As Long, ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long Private Declare Function EnumProcessModules Lib "PSAPI.DLL" (ByVal hProcess As Long, lphModule As Long, ByVal cb As Long, lpcbNeeded As Long) As Long Private Declare Function GetModuleFileNameExA Lib "PSAPI.DLL" (ByVal hProcess As Long, ByVal hModule As Long, ByVal ModuleName As String, ByVal nSize As Long) As Long Private Const MAX_PATH As Integer = 260 Public Function ListProcesses(lpArrIds() As Long, lpArrNames() As String, lpArrPaths() As String) As Boolean Dim lCB As Long, lLastProc As Long Dim c As Long lCB = 512 Do ReDim lpArrIds(0 To (lCB \ 4) - 1) As Long If EnumProcesses(lpArrIds(0), lCB, lLastProc) = 0 Then Exit Function End If If lLastProc <= lCB Then Exit Do End If lCB = lCB * 2 Loop lCB = (lLastProc \ 4) - 1 ReDim Preserve lpArrIds(0 To lCB) As Long ReDim lpArrNames(0) ReDim lpArrPaths(0) For c = 0 To UBound(lpArrIds) ReDim Preserve lpArrNames(c) ReDim Preserve lpArrPaths(c) GetProcessName_Path lpArrIds(c), lpArrNames(c), lpArrPaths(c) Next c End Function Private Function GetProcessName_Path(ByVal lProcessID As Long, ByRef lpName As String, ByRef lpPath As String) As Boolean Dim lpstrTMP As String Dim lLen As Long, hProcess As Long Dim arrModules(0 To 1023) As Long Dim lcbNeeded As Long Dim lCounter As Long Dim lR As Long Const PROCESS_QUERY_INFORMATION = &H400 Const PROCESS_VM_READ = &H10 lLen = MAX_PATH hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, lProcessID) If (lProcessID = 0) Then lpName = "System Idle Process" ElseIf (lProcessID = 2) Then lpName = "System Process" Else If (hProcess <> 0) Then If (EnumProcessModules(hProcess, arrModules(0), 1024 * 4, lcbNeeded)) Then lpstrTMP = String$(lLen, 0) LSet lpstrTMP = "UNKNOWN" lR = GetModuleBaseName(hProcess, arrModules(lCounter), lpstrTMP, lLen) lpName = Left$(lpstrTMP, InStr(lpstrTMP, vbNullChar) - 1) lpstrTMP = String$(lLen, 0) LSet lpstrTMP = "UNKNOWN" lR = GetModuleFileNameExA(hProcess, arrModules(lCounter), lpstrTMP, lLen) lpPath = Left$(lpstrTMP, InStr(lpstrTMP, vbNullChar) - 1) End If End If End If CloseHandle hProcess End Function In Form1 adauga codul urmator, dupa ce plasezi un CommandButton. Private Sub Command1_Click() Dim lpPs() As Long Dim lpNames() As String, x As Long, lpPaths() As String ListProcesses lpPs, lpNames, lpPaths For x = 1 To UBound(lpPs) lstProcess.AddItem lpPaths(x) Next x End Sub Cum functioneaza? Functia ListProcesses are la baza functia API EnumProcesses, care returneaza ID-urile de proces folosite pentru a popula vectorul lpArrIDs. Pentru a gestiona memoria eficient, vectorul se dimensioneaza in functie de rezultatul acestei functii (vezi loop-ul functie de lLastProc si lCB). Pe baza ID-urilor se deschide fiecare proces (functia GetProcessName_Path), si se foloseste handle-ul pentru a scoate numele si calea catre executabil (GetModuleBaseName respectiv GetModuleFileNameExA). |
#5
Posted 26 June 2006 - 13:20
Merci pentru cod. L-am probat si merge perfect. Acum mai e o problema si asta cred ca, chiar nu are rezolvare.
Daca deschizi un fisier .txt ( de pe desktop de exemplu ) al proces iti arata Notepad.exe pentru ca programul care ruleaza este notepad. Crezi ca se poate sa obtii si calea catre fisierul de pe desktop ? |
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users