برگزیده های پرشین تولز

آیا تابع یا دستوری در vb هست که بتونه یه فایل exe رو اجرا کنه؟

yehnafar

Registered User
تاریخ عضویت
24 ژانویه 2003
نوشته‌ها
209
لایک‌ها
0
محل سکونت
تهران
اقا من میخوام با این سواد نداشته ام یه برنامه بنویسم که هر مثلا شصت دقیقه یکبار بره و از یک مسیر خاص یه فایل exe را اجرا کنه.
مثلا : در شروع برنامه بره از اینجا:
E:/1/ssiim.exe

بعد شصت دقیقه بره از اینجا:
E:/2/ssiim.exe

بعد شصت دقیقه دیگه از اینجا:
E:/3/ssiim.exe

و به همین ترتیب تا مثلا 100 بار بره و از مسیر داده شده اون فایل ssiim.exe رو اجرا کنه. حالا کاری هم نداشته باشه که برنامه exe قبلیه رو که اجرا کرده، اجراش تموم شده یا نه.

ولی چون اصولا برنامه نویس نیستم و به خاطر قسمتی از تزم مجبورم یه همچین کاری بکنم «مشکل اولم» اینه که نمی دونم آیا اصلا تابعی یا دستوری تو vb هست که بتونه یه فایل exe رو هر مثلا 60 دقیقه یکبار بره اجرا کنه؟:wacko: :wacko:
 

Piter1356

کاربر تازه وارد
تاریخ عضویت
11 اکتبر 2004
نوشته‌ها
395
لایک‌ها
0
محل سکونت
tehran

yehnafar

Registered User
تاریخ عضویت
24 ژانویه 2003
نوشته‌ها
209
لایک‌ها
0
محل سکونت
تهران
به نقل از Piter1356 :
با shell و تایمر و یه الگوریتم ساده شدنیه .

دقیقا با شل خواستم بکنم این کارو. منتها شل ظاهرا تا برنامه قبلیه تموم نشه بعدی رو شروع نمی کنه.
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
از اين كد استفاده كن يه مدل باز كن و اينها رو توش كپي كن :
کد:
Const INFINITE = &HFFFF
Const STARTF_USESHOWWINDOW = &H1
Private Enum enSW
    SW_HIDE = 0
    SW_NORMAL = 1
    SW_MAXIMIZE = 3
    SW_MINIMIZE = 6
End Enum
Private Type PROCESS_INFORMATION
    hProcess As Long
    hThread As Long
    dwProcessId As Long
    dwThreadId As Long
End Type
Private Type STARTUPINFO
    cb As Long
    lpReserved As String
    lpDesktop As String
    lpTitle As String
    dwX As Long
    dwY As Long
    dwXSize As Long
    dwYSize As Long
    dwXCountChars As Long
    dwYCountChars As Long
    dwFillAttribute As Long
    dwFlags As Long
    wShowWindow As Integer
    cbReserved2 As Integer
    lpReserved2 As Byte
    hStdInput As Long
    hStdOutput As Long
    hStdError As Long
End Type
Private Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
End Type
Private Enum enPriority_Class
    NORMAL_PRIORITY_CLASS = &H20
    IDLE_PRIORITY_CLASS = &H40
    HIGH_PRIORITY_CLASS = &H80
End Enum
Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As SECURITY_ATTRIBUTES, lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Function SuperShell(ByVal App As String, ByVal WorkDir As String, dwMilliseconds As Long, ByVal start_size As enSW, ByVal Priority_Class As enPriority_Class) As Boolean
    Dim pclass As Long
    Dim sinfo As STARTUPINFO
    Dim pinfo As PROCESS_INFORMATION
    'Not used, but needed
    Dim sec1 As SECURITY_ATTRIBUTES
    Dim sec2 As SECURITY_ATTRIBUTES
    'Set the structure size
    sec1.nLength = Len(sec1)
    sec2.nLength = Len(sec2)
    sinfo.cb = Len(sinfo)
    'Set the flags
    sinfo.dwFlags = STARTF_USESHOWWINDOW
    'Set the window's startup position
    sinfo.wShowWindow = start_size
    'Set the priority class
    pclass = Priority_Class
    'Start the program
    If CreateProcess(vbNullString, App, sec1, sec2, False, pclass, _
    0&, WorkDir, sinfo, pinfo) Then
        'Wait
'اگه ميخواي وايس تا تموم بشه خط بعد رو از حالت مارك شده در بيار
'        WaitForSingleObject pinfo.hProcess, dwMilliseconds
        SuperShell = True
    Else
        SuperShell = False
    End If
End Function

بعد از اين دستور استفاده كن
کد:
SuperShell "c:\test\test.exe","c:\test\",0, SW_NORMAL, HIGH_PRIORITY_CLASS
 

phyma

کاربر تازه وارد
تاریخ عضویت
21 اکتبر 2004
نوشته‌ها
39
لایک‌ها
0
ین فایا رو که حیلی راحته هم یک مطالعه کن من که با هاش خیلی راحت کار می کنم یک API رو توضیح مده
 

فایل های ضمیمه

  • shellexecute.zip
    4 KB · نمایش ها: 9

ali313

Registered User
تاریخ عضویت
26 ژوئن 2005
نوشته‌ها
280
لایک‌ها
0
سن
41
محل سکونت
زیر خون قمه ، زنجیر ، سینه ، لطم ، سیلی و ... جای
این shell دستورات داس رو چه جوری اجرا میکنه مثلا کپی کردن یه برنامه از یک دایرکتوری به دایرکتوری دیگه دستورش چه شکلیه؟
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
به نقل از ali313 :
این shell دستورات داس رو چه جوری اجرا میکنه مثلا کپی کردن یه برنامه از یک دایرکتوری به دایرکتوری دیگه دستورش چه شکلیه؟
برای اجرا دستوارت داس توسط شلی که گفتم یا شل vb باید از cmd.exe یا command.exe با سوئیچ /c استفاده کنی فرض کن میخوای از درایو c دایرکتوری بگیری با سوئیچ /w میشه
کد:
command /c dir c:\  /w
یا بصورت کلی میشه
کد:
command /c [the command u want with switches]
:lol:
 

littlerabbit

مدیر بازنشسته
کاربر فعال
تاریخ عضویت
13 جولای 2003
نوشته‌ها
678
لایک‌ها
6
سن
42
محل سکونت
Iran
فکر میکنم منظور پیتر خود تابع Shell توی وی بی بود!!!! که یه برنامه خارجی رو اجرا میکنه.
 

Piter1356

کاربر تازه وارد
تاریخ عضویت
11 اکتبر 2004
نوشته‌ها
395
لایک‌ها
0
محل سکونت
tehran
به نقل از yehnafar :
دقیقا با شل خواستم بکنم این کارو. منتها شل ظاهرا تا برنامه قبلیه تموم نشه بعدی رو شروع نمی کنه.

امیدوارم مشکلت حل شده باشه

ضمنا باید بگم تایمر کمک میکنه که مشکل پشت سرهم اجرا شدن برنامه ها رو نداشته باشی
 

Piter1356

کاربر تازه وارد
تاریخ عضویت
11 اکتبر 2004
نوشته‌ها
395
لایک‌ها
0
محل سکونت
tehran
به نقل از littlerabbit :
فکر میکنم منظور پیتر خود تابع Shell توی وی بی بود!!!! که یه برنامه خارجی رو اجرا میکنه.

درست فکر کردی !!
 

yehnafar

Registered User
تاریخ عضویت
24 ژانویه 2003
نوشته‌ها
209
لایک‌ها
0
محل سکونت
تهران
به نقل از saeedsmk :
از اين كد استفاده كن يه مدل باز كن و اينها رو توش كپي كن :
کد:
Const INFINITE = &HFFFF
Const STARTF_USESHOWWINDOW = &H1
Private Enum enSW
    SW_HIDE = 0
    SW_NORMAL = 1
    SW_MAXIMIZE = 3
    SW_MINIMIZE = 6
End Enum
Private Type PROCESS_INFORMATION
    hProcess As Long
    hThread As Long
    dwProcessId As Long
    dwThreadId As Long
End Type
Private Type STARTUPINFO
    cb As Long
    lpReserved As String
    lpDesktop As String
    lpTitle As String
    dwX As Long
    dwY As Long
    dwXSize As Long
    dwYSize As Long
    dwXCountChars As Long
    dwYCountChars As Long
    dwFillAttribute As Long
    dwFlags As Long
    wShowWindow As Integer
    cbReserved2 As Integer
    lpReserved2 As Byte
    hStdInput As Long
    hStdOutput As Long
    hStdError As Long
End Type
Private Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
End Type
Private Enum enPriority_Class
    NORMAL_PRIORITY_CLASS = &H20
    IDLE_PRIORITY_CLASS = &H40
    HIGH_PRIORITY_CLASS = &H80
End Enum
Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As SECURITY_ATTRIBUTES, lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Function SuperShell(ByVal App As String, ByVal WorkDir As String, dwMilliseconds As Long, ByVal start_size As enSW, ByVal Priority_Class As enPriority_Class) As Boolean
    Dim pclass As Long
    Dim sinfo As STARTUPINFO
    Dim pinfo As PROCESS_INFORMATION
    'Not used, but needed
    Dim sec1 As SECURITY_ATTRIBUTES
    Dim sec2 As SECURITY_ATTRIBUTES
    'Set the structure size
    sec1.nLength = Len(sec1)
    sec2.nLength = Len(sec2)
    sinfo.cb = Len(sinfo)
    'Set the flags
    sinfo.dwFlags = STARTF_USESHOWWINDOW
    'Set the window's startup position
    sinfo.wShowWindow = start_size
    'Set the priority class
    pclass = Priority_Class
    'Start the program
    If CreateProcess(vbNullString, App, sec1, sec2, False, pclass, _
    0&, WorkDir, sinfo, pinfo) Then
        'Wait
'اگه ميخواي وايس تا تموم بشه خط بعد رو از حالت مارك شده در بيار
'        WaitForSingleObject pinfo.hProcess, dwMilliseconds
        SuperShell = True
    Else
        SuperShell = False
    End If
End Function

بعد از اين دستور استفاده كن
کد:
SuperShell "c:\test\test.exe","c:\test\",0, SW_NORMAL, HIGH_PRIORITY_CLASS


من برنامه بالا رو به شكل زير در آوردم و يه فايل exe به نام runner ساختم كه اونو هم ميذارم بالا. اين برنامه كاملا كاري رو كه قبلا گفته بودم و مي خواستم انجام ميده . فقط يه اشكال داره و اونم فقط اينه كه در طول مدت زماني كه برنامه runner در حال اجراست CPU Usage را صد در صد اشغال ميكنه. ( در يك دستگاه با cpu 1.7 گيگ)

چون خود اون برنامه اي كه من مي خوام runner اون رو اجرا كنه ( و اسمشمSSIIM.EXE است و در متن برنامه زير اوردمش) پنجاه تا صد درصد سي پي يو رو اشغال مي كنه و خب اين در واقع مشكل درست ميكنه.
شما چيزي به نظرتون مي رسه كه اشكال كجاست كه باعث ميشه كه اين حجم از سي پي يو اشغال بشه؟

کد:
Const INFINITE = &HFFFF
Const STARTF_USESHOWWINDOW = &H1
Private Enum enSW
    SW_HIDE = 0
    SW_NORMAL = 1
    SW_MAXIMIZE = 3
    SW_MINIMIZE = 6
End Enum
Private Type PROCESS_INFORMATION
    hProcess As Long
    hThread As Long
    dwProcessId As Long
    dwThreadId As Long
End Type
Private Type STARTUPINFO
    cb As Long
    lpReserved As String
    lpDesktop As String
    lpTitle As String
    dwX As Long
    dwY As Long
    dwXSize As Long
    dwYSize As Long
    dwXCountChars As Long
    dwYCountChars As Long
    dwFillAttribute As Long
    dwFlags As Long
    wShowWindow As Integer
    cbReserved2 As Integer
    lpReserved2 As Byte
    hStdInput As Long
    hStdOutput As Long
    hStdError As Long
End Type
Private Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
End Type
Private Enum enPriority_Class
    NORMAL_PRIORITY_CLASS = &H20
    IDLE_PRIORITY_CLASS = &H40
    HIGH_PRIORITY_CLASS = &H80
End Enum
Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As SECURITY_ATTRIBUTES, lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Function SuperShell(ByVal App As String, ByVal WorkDir As String, dwMilliseconds As Long, ByVal start_size As enSW, ByVal Priority_Class As enPriority_Class) As Boolean
    Dim pclass As Long
    Dim sinfo As STARTUPINFO
    Dim pinfo As PROCESS_INFORMATION
    'Not used, but needed
    Dim sec1 As SECURITY_ATTRIBUTES
    Dim sec2 As SECURITY_ATTRIBUTES
    'Set the structure size
    sec1.nLength = Len(sec1)
    sec2.nLength = Len(sec2)
    sinfo.cb = Len(sinfo)
    'Set the flags
    sinfo.dwFlags = STARTF_USESHOWWINDOW
    'Set the window's startup position
    sinfo.wShowWindow = start_size
    'Set the priority class
    pclass = Priority_Class
    'Start the program
    If CreateProcess(vbNullString, App, sec1, sec2, False, pclass, _
    0&, WorkDir, sinfo, pinfo) Then
        'Wait
'
'        WaitForSingleObject pinfo.hProcess, dwMilliseconds
        SuperShell = True
    Else
        SuperShell = False
    End If
End Function




Private Sub Command1_Click()

    t = Val(Text1.Text)
    n = Val(Text2.Text)
    
    For i = 1 To n
        m = 1 + Int(Log(n) / Log(10))
        Path = "E:\ssiim\" + Right$(Str$(n), m)
        SuperShell Path + "\ssiimwin.exe", Path, 0, SW_NORMAL, HIGH_PRIORITY_CLASS
        t2 = Timer
        If i < n Then
            Do
            Loop Until t2 + t < Timer
        End If
        
    Next i
    
        
End Sub

Private Sub Command2_Click()
    Unload Me
End Sub
 

فایل های ضمیمه

  • Runner.zip
    4.6 KB · نمایش ها: 2

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
اشكال از اين دستوره

کد:
Do
            Loop Until t2 + t < Timer

اين دستور چون يه لوپ طولاني مدت هست و پشت سر هم اجرا ميشه تمام سي پيو رو اشغال ميكنه
راه حل يا از api ها استفاده كنييد يعني
کد:
 Do
sleep(1)
            Loop Until t2 + t < Timer
كه باعث ميشه برنامه براي مدت يك صدم پانيه متوقف بشه و ويندوز بقيه كار ها رو انجام بده يعني هميشه سي پيو رو اشغال نمكنه فقط هر يك ميلي سكند يك چند هزارم ثانيه چك شدن انجام ميشه
و راه حل دوم استفاده از doevents كه تاثير مشابه Sleep داره اينكه اختيار اجرا شدن دستورات را به سيستم عامل برميگردونه و بعد سيستم عامل كه يك دستور رو انجام داد دوباره اختيار رو به برنامه مبده و اين بازي با هر دفعه صدا زدن اين تابع انجام ميشه و در نتيجه اين حالت استفاده 100 درصد از سي پيو يا گرفتار شدن در حلقه از بين ميره

کد:
Do
doevnets
            Loop Until t2 + t < Timer

در ضمن بعد از اينكه پست كردم يه چيزي به چشم خورد
توي وي بي بعد براي خروج بهتر ( زماني كه از Api استفاده ميكني ) يعد از unlod me يك خط ديگر هم بگذاري يعني دستور end اين دستور خيلي جلويي باگ هاي بعدي و اشغال شدن الكي حافظه توسط برنامه هاي درست بسته نشده رو ميگيره
اميدوارم كمك كنه
 

yehnafar

Registered User
تاریخ عضویت
24 ژانویه 2003
نوشته‌ها
209
لایک‌ها
0
محل سکونت
تهران
اقا من اين دو تا رو امتحان كردم ولي جواب نداد.

يعني وقتي sleep (1 رو به زير خط do اضافه كردم ارور داد و گفت همچين فانكشني رو نمي شناسه.
doevent رو هم كه اضافه كردم اشكال نگرفت ولي اون مشكل اشغال صد در صد سي پي يو باقي بود و هيچ تغيري نكرده بود. :( :(
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
اقا اينم كد
کد:
Const INFINITE = &HFFFF
Const STARTF_USESHOWWINDOW = &H1
Private Enum enSW
    SW_HIDE = 0
    SW_NORMAL = 1
    SW_MAXIMIZE = 3
    SW_MINIMIZE = 6
End Enum
Private Type PROCESS_INFORMATION
    hProcess As Long
    hThread As Long
    dwProcessId As Long
    dwThreadId As Long
End Type
Private Type STARTUPINFO
    cb As Long
    lpReserved As String
    lpDesktop As String
    lpTitle As String
    dwX As Long
    dwY As Long
    dwXSize As Long
    dwYSize As Long
    dwXCountChars As Long
    dwYCountChars As Long
    dwFillAttribute As Long
    dwFlags As Long
    wShowWindow As Integer
    cbReserved2 As Integer
    lpReserved2 As Byte
    hStdInput As Long
    hStdOutput As Long
    hStdError As Long
End Type
Private Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
End Type
Private Enum enPriority_Class
    NORMAL_PRIORITY_CLASS = &H20
    IDLE_PRIORITY_CLASS = &H40
    HIGH_PRIORITY_CLASS = &H80
End Enum
Private unLoadMe As Boolean
Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As SECURITY_ATTRIBUTES, lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Function SuperShell(ByVal App As String, ByVal WorkDir As String, dwMilliseconds As Long, ByVal start_size As enSW, ByVal Priority_Class As enPriority_Class) As Boolean
    Dim pclass As Long
    Dim sinfo As STARTUPINFO
    Dim pinfo As PROCESS_INFORMATION
    'Not used, but needed
    Dim sec1 As SECURITY_ATTRIBUTES
    Dim sec2 As SECURITY_ATTRIBUTES
    'Set the structure size
    sec1.nLength = Len(sec1)
    sec2.nLength = Len(sec2)
    sinfo.cb = Len(sinfo)
    'Set the flags
    sinfo.dwFlags = STARTF_USESHOWWINDOW
    'Set the window's startup position
    sinfo.wShowWindow = start_size
    'Set the priority class
    pclass = Priority_Class
    'Start the program
    If CreateProcess(vbNullString, App, sec1, sec2, False, pclass, _
    0&, WorkDir, sinfo, pinfo) Then
        'Wait
'
'        WaitForSingleObject pinfo.hProcess, dwMilliseconds
        SuperShell = True
    Else
        SuperShell = False
    End If
End Function




Private Sub Command1_Click()
    Dim ExitLoop As Boolean
    t = Val(Text1.Text)
    n = Val(Text2.Text)
    
    For i = 1 To n
        m = 1 + Int(Log(n) / Log(10))
        'Path = "E:\ssiim\" + Right$(Str$(n), m)
        'SuperShell Path + "\ssiimwin.exe", Path, 0, SW_NORMAL, HIGH_PRIORITY_CLASS
        MsgBox "x"
        t2 = Timer
        If i < n Then
            Do
                Sleep 1
                DoEvents
                If unLoadMe Then Exit Sub
            Loop Until (t2 + t < Timer)
        End If
        
    Next i
    
        
End Sub

Private Sub Command2_Click()
    Unload Me
End Sub

Private Sub Form_Load()
    unLoadMe = False
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    unLoadMe = True
End Sub
اقا اميدوارم كمكت كنه
 

yehnafar

Registered User
تاریخ عضویت
24 ژانویه 2003
نوشته‌ها
209
لایک‌ها
0
محل سکونت
تهران
آقا دستت درست. گمونم كار ميكنه :)

ايشالا عروسيت. :lol:
 
بالا