Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
ERR_ADDRESS_UNREACHABLE

Legea 18/1968 Se mai aplica?

Digi conectare 2 routere prin fir

Succesiune notar versus instanta ...
 Montaj aer conditionat in balcon ...

Cont curent mulți valuta far...

Sugestii plan casa

Experiente cu firme care cumpara ...
 joc idem Half Life gratis

PC game stream catre Nvidia Shiel...

Pompa de apa HEPU ?!

Vreau o masina electrica de tocat...
 Cum ajunge remorca de tir inapoi ...

Alt "Utilizator nou" pe T...

ULBS INFORMATICA

Index preturi
 

Calea unui fisier deschis

- - - - -
  • Please log in to reply
4 replies to this topic

#1
Xcutioner

Xcutioner

    Junior Member

  • Grup: Members
  • Posts: 77
  • Înscris: 06.07.2004
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
Atr3ides

Atr3ides

    New Member

  • Grup: Members
  • Posts: 4
  • Înscris: 06.01.2006

 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?

#3
Xcutioner

Xcutioner

    Junior Member

  • Grup: Members
  • Posts: 77
  • Înscris: 06.07.2004
Deci... Programul meu ruleaza ... Utilizatorul deschide (nu prin aplicatia mea) o aplicatie mai exact un fisier Notepad sau un fisier text. Cum aflu calea catre acea aplicatie.

#4
Atr3ides

Atr3ides

    New Member

  • Grup: Members
  • Posts: 4
  • Înscris: 06.01.2006
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  :D:

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
Xcutioner

Xcutioner

    Junior Member

  • Grup: Members
  • Posts: 77
  • Înscris: 06.07.2004
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

Chirurgia spinală minim invazivă 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

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate