View Full Version : اجرا برنامه با ترتیب خاص با دستور shell
karbon2010
پنج شنبه 23 دی 1389, 09:02 صبح
با سلام
دوستان ما سه فایل اجرایی داریم با نامهای
a.exe
b.exe
c.exe
ایا راهی هست که بتوان این سه برنامه را با ترتیب خاص اجرا نمود یعنی اول a اجرا بشه بعد از بسته شدن ان b اجرا بشه و بعد از بسته شدن ان c اجرا بشه و بعد از بسته شدن ان مقداری را برگرداند که ما برنامه اصلی را ببندیم
البته من با دستور shell کارهایی کردم اما باز به مشکل خوردم.
ممنون
IamOverlord
پنج شنبه 23 دی 1389, 13:46 عصر
سلام دوست عزیز!
برای پیدا کردن ProcessId فایل مورد نظر از GetProcessId و برای این که بفهمید اجرای Process مورد نظر به اتمام رسیده است یا نه هم از IsProcessRunning استفاده کنید.
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, th32ProcessID As Long) As Long
Private Const TH32CS_SNAPPROCESS As Long = 2
Public Type PROCESSENTRY32
dwSize As Long
cntUseage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
swFlags As Long
szExeFile As String * 1024
End Type
Public Function GetFileProcessId(FileAddress As String) As Long
Dim hSnapShot As Long
Dim pe32 As PROCESSENTRY32
GetFileProcessId = -1
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
pe32.dwSize = Len(pe32)
Process32First hSnapShot, pe32
Do While Process32Next(hSnapShot, pe32) <> 0
If InStr(1, LCase(pe32.szExeFile), LCase(FileAddress)) > 0 Then
GetFileProcessId = pe32.th32ProcessID
End If
Loop
CloseHandle (hSnapShot)
End Function
Public Function IsProcessRunning(FileAddress As String) As Boolean
Dim hSnapShot As Long
Dim pe32 As PROCESSENTRY32
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
pe32.dwSize = Len(pe32)
Process32First hSnapShot, pe32
Do While Process32Next(hSnapShot, pe32) <> 0
If InStr(1, LCase(pe32.szExeFile), LCase(FileAddress)) > 0 Then
IsProcessRunning = True
End If
Loop
CloseHandle (hSnapShot)
End Function
:چشمک:
quiet_programmer
پنج شنبه 23 دی 1389, 16:12 عصر
سلام به همه.
ضمن تایید کد IamOverlord (http://barnamenevis.org/member.php?72921-IamOverlord) شما میتونین از WMI استفاده کنین که نسبت به کد بالا ساده تره
Private Function ProcessExist(PName As String) As Boolean
Set objwmiservice = GetObject("winmgmts:{impersonationLevel=impersonate}!\\." & "\root\cimv2")
Set ColProcessList = objwmiservice.execquery("SELECT * FROM Win32_Process")
For Each ObjProcess In ColProcessList
If UCase(ObjProcess.Name) = UCase(PName) Then
ProcessExist = True
Exit Function
End If
Next
ProcessExist = False
End Functionاین کد اسم پروسس رو میگیره حتما با پسوندش (البته اگه داشته باشه) بعد در صورت run بودن مقدار True و در غیر این صورت False رو برمیگردونه.
karbon2010
جمعه 24 دی 1389, 05:47 صبح
سلام
ممنون از شما دوستان
اما اگه می شد درباره این کدها یه توضیح بدهید ممنون می شدم یا نمونه برنامه یا نحوه فراخوانی و....
این را به این دلیل گفتم که تا راحتر و عمقی تر یاد بگیریم تا فردا روزی به مشکل نخوریم
karbon2010
چهارشنبه 29 دی 1389, 12:05 عصر
با سلام
دوستان من همچنان منتظرم اگه یه زحمتی بکشید در باره کد ها توضیح دهید ممنون میشم
quiet_programmer
چهارشنبه 29 دی 1389, 16:09 عصر
با سلام.
قبل توضیح از اساتید خواهش میکنم اگه دارم اشتباه میگم راهنمایی کنن:لبخند:
خط اول کد یه Object از WMI ایجاد میکنه به اسمه objwmiservice. که رشته داخل اون مشخص میکنه که برای چه کاری میخواین ازش استفاده کنین و یا اسم کامپیوتر چیه و غیره ولی تا اونجایی که من اطلاع دارم قسمت
!{winmgmts:{impersonationLevel=impersonate ثابته وبعد اون برای امکانات اضافی تر از رشته هایی ماند {Driver} و ... استفاده میشه بعد اون باید
نام کامپیوتر بیاد که اینجا با .// مشخص شده که به معنی کامپیوتر Localه.
خط دوم مشخصات پروسسهای در حال اجرا رو از جدول Win32_Process انتخاب میکنه و داخل متغییر ColProcessList قرار میده. این متغییر رو یه آرایه در نضر بگیر که اطلاعات پروسسها داخل اون قرار گرفته.
هر عنصر این آرایه شامل اطلاعات مربوط به یه پروسس در حاله اجراست که دارای یه سری خاصیته (property). مثلا name یا PID و ... برای دسترسی به عناصر این متغییر از حلقه For Each استفاده میکنیم.
هر بار اطلاعات یکی از این پروسسها تو متغییر ObjProcess قرار میگیره بعد اسم پروسس رو با اسم پروسسی که به تابع ارسال شده مقایسه میکنه و در نهایت اگه پروسس مورد نظر در حال اجرا باشه تابع مقدار True در غیر این صورت مقدار False بر میگردونه.
نحوه فراخوانی هم به این شکلیه (میخوایم بدونیم پراسس Explorer.exe در حالت اجراست یا نه)
if ProcessExist("Explorer.exe") then
msgbox "process runing!"
else
msgbox "Process Terminated"
end if
karbon2010
پنج شنبه 30 دی 1389, 08:25 صبح
سلام
اگه بتونی یه نمونه برنامه قرار بدی ممنون می شم
نمیدونم برای چی نمیتونم راهش بندازم
ممنون
quiet_programmer
پنج شنبه 30 دی 1389, 14:32 عصر
سلام.
تو textbox اسم پروسس رو بنویس و کلیک کن بهت میگه که پروسس در حا اجراست یا نه
در ضمن اگه رو دکمه Commend 2 کلیک کنی لیستی از پروسس های در حال اجرا رو بهت نشون میده
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.