PDA

View Full Version : سوال: خروجی فرامین داس در برنامه



drwatson
دوشنبه 31 تیر 1387, 13:24 عصر
سلام
این سوال رو قبلا مطرح کردم ولی کسی جواب نداد
در سایت هم سرچ زدم بهترین مطلب رو آقای s_vb.max
سال 85 گفته بود که کدشو در زیر قرار دادم
این دستور برای همه فرامین داس عمل نمیکنه
فقط برا اونایی عمل میکنه که خودشون مستقل از کامند پرامپت اجرا میشن
مثل ping
حالا اگه از دوستان کسی راهی بلده یا میتونه این اشکال رو رفع کنه خواهشمندم
لطف کنه
چون خیلی لازمش دارم
متشکرم:لبخند:
Option ExplicitPrivate Declare Function CreatePipe Lib "kernel32" (phReadPipe As Long, phWritePipe As Long, lpPipeAttributes As SECURITY_ATTRIBUTES, ByVal nSize As Long) As LongPrivate Declare Sub GetStartupInfo Lib "kernel32" Alias "GetStartupInfoA" (lpStartupInfo As STARTUPINFO)Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As Any, lpThreadAttributes As Any, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As LongPrivate Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As LongPrivate Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As Any) As LongPrivate Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPrivate Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As LongPrivate Type SECURITY_ATTRIBUTES nLength As Long lpSecurityDescriptor As Long bInheritHandle As LongEnd TypePrivate Type PROCESS_INFORMATION hProcess As Long hThread As Long dwProcessId As Long dwThreadId As LongEnd TypePrivate Type STARTUPINFO cb As Long lpReserved As Long lpDesktop As Long lpTitle As Long 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 LongEnd TypePrivate Type OVERLAPPED ternal As Long ternalHigh As Long offset As Long OffsetHigh As Long hEvent As LongEnd TypePrivate Const STARTF_USESHOWWINDOW = &H1Private Const STARTF_USESTDHANDLES = &H100Private Const SW_HIDE = 0Private Const EM_SETSEL = &HB1Private Const EM_REPLACESEL = &HC2Private Sub Command1_Click() Command1.Enabled = False Redirect Text1.Text, Text2 Command1.Enabled = TrueEnd SubPrivate Sub Form_Load() Text1.Text = "ping"End SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) If Command1.Enabled = False Then Cancel = TrueEnd SubSub Redirect(cmdLine As String, objTarget As Object) Dim i%, t$ Dim pa As SECURITY_ATTRIBUTES Dim pra As SECURITY_ATTRIBUTES Dim tra As SECURITY_ATTRIBUTES Dim pi As PROCESS_INFORMATION Dim sui As STARTUPINFO Dim hRead As Long Dim hWrite As Long Dim bRead As Long Dim lpBuffer(1024) As Byte pa.nLength = Len(pa) pa.lpSecurityDescriptor = 0 pa.bInheritHandle = True pra.nLength = Len(pra) tra.nLength = Len(tra) If CreatePipe(hRead, hWrite, pa, 0) > 0 Then sui.cb = Len(sui) GetStartupInfo sui sui.hStdOutput = hWrite sui.hStdError = hWrite sui.dwFlags = STARTF_USESHOWWINDOW Or STARTF_USESTDHANDLES sui.wShowWindow = SW_HIDE If CreateProcess(vbNullString, cmdLine, pra, tra, True, 0, Null, vbNullString, sui, pi) > 0 Then SetWindowText objTarget.hwnd, "" Do Erase lpBuffer() If ReadFile(hRead, lpBuffer(0), 1023, bRead, ByVal 0) Then SendMessage objTarget.hwnd, EM_SETSEL, -1, 0 SendMessage objTarget.hwnd, EM_REPLACESEL, False, lpBuffer(0) DoEvents Else CloseHandle pi.hThread CloseHandle pi.hProcess Exit Do End If CloseHandle hWrite Loop CloseHandle hRead End If End IfEnd Sub

roomezonline
سه شنبه 01 مرداد 1387, 00:27 صبح
سلام
این سوال رو قبلا مطرح کردم ولی کسی جواب نداد
در سایت هم سرچ زدم بهترین مطلب رو آقای s_vb.max
سال 85 گفته بود که کدشو در زیر قرار دادم
این دستور برای همه فرامین داس عمل نمیکنه
فقط برا اونایی عمل میکنه که خودشون مستقل از کامند پرامپت اجرا میشن
مثل ping
حالا اگه از دوستان کسی راهی بلده یا میتونه این اشکال رو رفع کنه خواهشمندم
لطف کنه
چون خیلی لازمش دارم
متشکرم:لبخند:
Option ExplicitPrivate Declare Function CreatePipe Lib "kernel32" (phReadPipe As Long, phWritePipe As Long, lpPipeAttributes As SECURITY_ATTRIBUTES, ByVal nSize As Long) As LongPrivate Declare Sub GetStartupInfo Lib "kernel32" Alias "GetStartupInfoA" (lpStartupInfo As STARTUPINFO)Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As Any, lpThreadAttributes As Any, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As LongPrivate Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As LongPrivate Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As Any) As LongPrivate Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPrivate Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As LongPrivate Type SECURITY_ATTRIBUTES nLength As Long lpSecurityDescriptor As Long bInheritHandle As LongEnd TypePrivate Type PROCESS_INFORMATION hProcess As Long hThread As Long dwProcessId As Long dwThreadId As LongEnd TypePrivate Type STARTUPINFO cb As Long lpReserved As Long lpDesktop As Long lpTitle As Long 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 LongEnd TypePrivate Type OVERLAPPED ternal As Long ternalHigh As Long offset As Long OffsetHigh As Long hEvent As LongEnd TypePrivate Const STARTF_USESHOWWINDOW = &H1Private Const STARTF_USESTDHANDLES = &H100Private Const SW_HIDE = 0Private Const EM_SETSEL = &HB1Private Const EM_REPLACESEL = &HC2Private Sub Command1_Click() Command1.Enabled = False Redirect Text1.Text, Text2 Command1.Enabled = TrueEnd SubPrivate Sub Form_Load() Text1.Text = "ping"End SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) If Command1.Enabled = False Then Cancel = TrueEnd SubSub Redirect(cmdLine As String, objTarget As Object) Dim i%, t$ Dim pa As SECURITY_ATTRIBUTES Dim pra As SECURITY_ATTRIBUTES Dim tra As SECURITY_ATTRIBUTES Dim pi As PROCESS_INFORMATION Dim sui As STARTUPINFO Dim hRead As Long Dim hWrite As Long Dim bRead As Long Dim lpBuffer(1024) As Byte pa.nLength = Len(pa) pa.lpSecurityDescriptor = 0 pa.bInheritHandle = True pra.nLength = Len(pra) tra.nLength = Len(tra) If CreatePipe(hRead, hWrite, pa, 0) > 0 Then sui.cb = Len(sui) GetStartupInfo sui sui.hStdOutput = hWrite sui.hStdError = hWrite sui.dwFlags = STARTF_USESHOWWINDOW Or STARTF_USESTDHANDLES sui.wShowWindow = SW_HIDE If CreateProcess(vbNullString, cmdLine, pra, tra, True, 0, Null, vbNullString, sui, pi) > 0 Then SetWindowText objTarget.hwnd, "" Do Erase lpBuffer() If ReadFile(hRead, lpBuffer(0), 1023, bRead, ByVal 0) Then SendMessage objTarget.hwnd, EM_SETSEL, -1, 0 SendMessage objTarget.hwnd, EM_REPLACESEL, False, lpBuffer(0) DoEvents Else CloseHandle pi.hThread CloseHandle pi.hProcess Exit Do End If CloseHandle hWrite Loop CloseHandle hRead End If End IfEnd Sub


دوست عزیز من قبلا یه این سوال شما با پاسخ دادم فقط کمی سرچ می کردی:عصبانی++:د

http://barnamenevis.org/forum/مباحث-مربوط-به-برنامه-نویسی-در-vb/114370-اجرای-فرمان-های-داس-command-prompt.html

drwatson
سه شنبه 01 مرداد 1387, 12:29 عصر
دوست عزیز من قبلا یه این سوال شما با پاسخ دادم فقط کمی سرچ می کردی:عصبانی++:د

http://barnamenevis.org/forum/مباحث-مربوط-به-برنامه-نویسی-در-vb/114370-اجرای-فرمان-های-داس-command-prompt.html

عزیزم اینی که شما گفتید فقط اجرای فرمان داس هستش تازه راه بهتری هم براش هست
من میخوام خروجی رو به برنامه من بفرسته
و اونم بطور مستقیم نه بوسیله یه فایل دیگه
لطفا به سوال دقت کنید:عصبانی++::عصبانی++::عصبا ی++:

bobrus
سه شنبه 01 مرداد 1387, 15:10 عصر
خوب دوست عزيز اگه به كد اولي كه خودت دادي يه دقت بكني مي بيني كه اونم با استفاده از فايل همين كارو انجام داه منتها با اين تفاوت كه از دستورات API استفاده كرده و فايل رو از بافر حافظه مي خونه . به نظر من لقمه رو دور سرش چرخونده وقتي ميشه به راحتي آب خوردن خروجي يه دستور رو توي يه فايل قرار داد و بعد از اون فايل استخراج كرد چرا بايد اينهمه دردسر كشيد؟ ( البته ممكنه شما دليل منطقي براي اينكار داشته باشيد)


shell "Command >FileName"
دستور بالا خروجي فرامين داس رو به يه فايل منتقل مي كنه و مي توني ازش هر استفاده اي كه خواستي بكني ساده تر از اين نمي توني پيدا كني

__siavash__
سه شنبه 01 مرداد 1387, 19:45 عصر
شما این برنامه رو دیدید !؟!

drwatson
چهارشنبه 02 مرداد 1387, 12:21 عصر
شما این برنامه رو دیدید !؟!
بله این همون برنامست
شما اگه توی تکس باکس بنویسی ping یا nslookup و.. کار میکنه
ولی مثلا بنویس dir میبینی که خروجی به برنامه نمیاد
حتی من دستور cmd.exe dir رو امتحان کردم اما فقط خروجی دستور cmd.exe رو
برمیگردونه ونه دستور dir

roomezonline
یک شنبه 13 مرداد 1387, 23:53 عصر
شما این برنامه رو دیدید !؟!
منم همین مشکل رو پیدا کردم

vbhamed
چهارشنبه 15 خرداد 1392, 12:39 عصر
سلام

هرچند تاپيك قديميه ولي براي دوستاني كه به اين تاپيك ارجاع داده ميشن يا بعدا اين رو مي‌بينن مي‌نويسيم
تو اينطور برنامه ها، براي اينكه دستورات داخلي مثل dir و ... اجرا بشه اينطوري بنويسيد
cmd /c dir c:\
اينم يك نمونه برنامه

niko2008
چهارشنبه 15 خرداد 1392, 14:41 عصر
سلام استاد خیلی عالی بود
بنظر شما در txtCommand چطور میتونم با up و dowen کامند ها زده شده رو دوباره فراخوانی کرد؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
خواهشن؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟

بهروز عباسی
چهارشنبه 15 خرداد 1392, 14:48 عصر
سلام استاد خیلی عالی بود
بنظر شما در txtCommand چطور میتونم با up و dowen کامند ها زده شده رو دوباره فراخوانی کرد؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
خواهشن؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟
هر دستوری که اجرا میکنی توی یک لیست (ارایه) نگه دار و بعد با استفاده از رویدادهای کیبرد با کلید های بالا و پایین توی لیست جابه جا شو و کار تمومه:کف:

niko2008
پنج شنبه 16 خرداد 1392, 09:01 صبح
هر دستوری که اجرا میکنی توی یک لیست (ارایه) نگه دار و بعد با استفاده از رویدادهای کیبرد با کلید های بالا و پایین توی لیست جابه جا شو و کار تمومه:کف:

خیلی عالی بود ولی یه دستور رو که تکه تکه مي زنی بعد در دستور کامل رو چطوری باید سرجمع کرد در لیست باکس شما.....?????

vbhamed
پنج شنبه 16 خرداد 1392, 14:19 عصر
سلام
تيكه تيكه نمي‌زني كه
وقتي كليد Enter رو زدي كه دستورت اجرا بشه همون موقع كلش رو به ليست اضافه كن

niko2008
شنبه 18 خرداد 1392, 23:47 عصر
سلام
تيكه تيكه نمي‌زني كه
وقتي كليد Enter رو زدي كه دستورت اجرا بشه همون موقع كلش رو به ليست اضافه كن

ببخشید استاد میتونید یه نمونه بزارین..,,