PDA

View Full Version : بستن برنامه با استفاده از مسیر



ali190
جمعه 08 آذر 1398, 16:41 عصر
باسلام
من چطور میتونم یه نرم افزار رو با استفاده از مسیر نرم افزار ببندم؟
توجه داشته باشید که چون برنامه در هنگام خروج log تولید میکنه واسه همین نمیخوام برنامه از طریق task manager کیل یا بسته بشه
تاکیدم بر روی مسیر برنامه هست چون از این برنامه دو تا رو سیستم نصب شده و هنگامیکه هر دو برنامه باز هست من میوام یکی از اونهارو با استفاده از مسیر برنامه ببندم
ممنون میشم راهنماییم کنید.

the king
جمعه 08 آذر 1398, 18:13 عصر
باسلام
من چطور میتونم یه نرم افزار رو با استفاده از مسیر نرم افزار ببندم؟
توجه داشته باشید که چون برنامه در هنگام خروج log تولید میکنه واسه همین نمیخوام برنامه از طریق task manager کیل یا بسته بشه
تاکیدم بر روی مسیر برنامه هست چون از این برنامه دو تا رو سیستم نصب شده و هنگامیکه هر دو برنامه باز هست من میوام یکی از اونهارو با استفاده از مسیر برنامه ببندم
ممنون میشم راهنماییم کنید.

اول لیست پروسه های در حال اجرا رو بدست میارید. بعد سعی میکنید بازشون کنید که ببینید مسیر فایل اجرایی شون چیه.
هر کدوم که با دسترسی مناسب کار ما باز شدنی باشن رو باز می کنید و چک می کنید که آیا مسیر فایل اجرایی شون اونی که میخواهید هست یا نه.
اگر همون مسیر بود بهش فرمان بسته شدن میدید، بزرگی و کوچیکی حروف در مسیر مهم نیست ولی حتما مسیر کامل باشه چون دارید با مسیر کامل مقایسه می کنید، در مسیر نباید موارد نسبی مثل \..\ باشه :


Private Const MAX_PATH As Long = 260
Private Const PROCESS_QUERY_INFORMATION As Long = &H400
Private Const PROCESS_VM_READ As Long = &H10
Private Const PROCESS_TERMINATE As Long = &H1

Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Private Declare Function GetModuleFileNameExW Lib "psapi.dll" (ByVal hProcess As Long, ByVal hModule As Long, ByVal lpFilename As Long, ByVal nSize As Long) As Long
Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function EnumProcesses Lib "psapi.dll" (ByRef lpidProcess As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32.dll" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long

Private Sub CloseApp(ByVal path As String)
Dim idProcess() As Long
Dim cbNeeded As Long
Dim cbSize As Long
Dim i As Integer
Dim lastIndex As Integer
Dim handle As Long
Dim filenameLength As Long
ReDim idProcess(0 To 1000)
Dim filenameBuffer() As Byte
Dim filename As String
Do
cbSize = 4 * (UBound(idProcess) + 1)
If EnumProcesses(idProcess(0), cbSize, cbNeeded) = 0 Then
MsgBox "Error"
Exit Sub
End If
If cbNeeded < cbSize Then
Exit Do
End If
ReDim idProcess(0 To UBound(idProcess) + 1000)
Loop While True
lastIndex = cbNeeded \ 4 - 1
For i = 0 To lastIndex
handle = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ Or PROCESS_TERMINATE, 0, idProcess(i))
If handle <> 0 Then
ReDim Preserve filenameBuffer(0 To MAX_PATH * 2)
filenameLength = GetModuleFileNameExW(handle, 0, VarPtr(filenameBuffer(0)), MAX_PATH * 2)
If filenameLength > 0 Then
ReDim Preserve filenameBuffer(0 To filenameLength * 2 - 1)
filename = filenameBuffer
If StrComp(filename, path, vbTextCompare) = 0 Then
TerminateProcess handle, 0
End If
End If
CloseHandle handle
End If
Next
End Sub

Private Sub Command1_Click()
CloseApp "c:\Windows\System32\calc.exe"
End Sub

ali190
جمعه 08 آذر 1398, 18:29 عصر
سلام
کدی که گذاشتید کار نمیکنه

the king
جمعه 08 آذر 1398, 18:50 عصر
سلام
کدی که گذاشتید کار نمیکنه
با برنامه ماشین حساب ویندوز امتحان کردید یا مسیر خاص برنامه خودتون؟

ali190
جمعه 08 آذر 1398, 18:56 عصر
برنامه ماشین حساب رو هم نمیبنده باهمون مسیر

the king
جمعه 08 آذر 1398, 19:25 عصر
برنامه ماشین حساب رو هم نمیبنده باهمون مسیر

مسیر برنامه ماشین حساب که در سیستم شما همونه؟ درسته؟
می توانید بین سطر TerminateProcess handle, 0 و If قبلش یک MsgBox با متن دلخواه قرار بدید که ببینیم پروسه رو پیدا می کنه ولی نمیتونه ببندتش یا اصلا پیداش نمی کنه.

ali190
جمعه 08 آذر 1398, 19:49 عصر
جواب نمیده

ROSTAM2
یک شنبه 10 آذر 1398, 08:14 صبح
برای بستن برنامه با کدهای api می شه مثل hwnd و یا عنوان پنجره برنامه! ولی احتمال می دم خواسته شما اینه که برنامتون زمانی اجراست دوبار اجرا نشه ؟! ک فک کنم باید پراپرتیس برنامه رو دستکاری کنی! چون توی دات نت این مورد توی پراپرتیس پروژه است.
اگر هم که منظورتون بستن برنامه غیر هست که کدهای api بیشترین کاربرد رو داره. (FindWindow, ...)

https://barnamenevis.org/showthread.php?474870-سورس-کد-کار-با-توابع-API-و-بستن-پنجره-خارجی


http://www.vbforums.com/showthread.php?515476-RESOLVED-VB6-Close-window-by-its-window-name (http://www.vbforums.com/showthread.php?515476-RESOLVED-VB6-Close-window-by-its-window-name)

حالا سوال اینجاست که چرا از طریق آدرس؟!؟

ali190
یک شنبه 10 آذر 1398, 20:41 عصر
سلام
چون من از اون برنامه در دو جای ویندوزم نصب کردم و میخوام فقط یک برنامه که طبیعتا با آدرسش منحصر به فرد میشه بسته بشه