PDA

View Full Version : اجرای برنامه به صورت مخفی و اطلاعات از عدم اجرای آن



milad3em
جمعه 22 فروردین 1393, 15:27 عصر
سلام دوستان تو این سایت خیلی دنبال اجرای برنامه ها گشتم اما فقط دستورات shell , shellexecute بودن و بدرد هم می خوردند اما من می خوام یه کار دیگه بکنم و خیلی هم مهمه
ببینید من یه فایل اکسل دارم که با اسکریپت هایی که براش نوشتم وقتی باز بشه یه سری اطلاعات رو از سایتم می گیره و خودشو ذخیره می کنه و خودش خودش رو می بینده حالا من می خوام از طریق برنامه ای که نوشتم با زدن یه دکمه مثلا رفرش برنامه بره اون فایل اکسل رو باز کنه و منتظر بشه تا عملیات او فایل اکسل که شاید 1 تا 2 دقیقه طول می کشه انجام بشه و وقتی اکسله بسته شد من اطلاعاتم رو از اون اکسل بگیرمش
مهم برام اینه که اون فایل اکسل حتما بصورت مخفی اجرا بشه و دیده نشه بعدم برنامه ام اگر میشه پیغام swich to رو که هنگام اجرای مخفی برنامه های دیگه میده ندهد مثلا برنامه کلا disable بشه و بعد از اجرای عملیات فوق ، خودش enable بشه
ممنون میشم از راهنماییهاتون

vbhamed
شنبه 23 فروردین 1393, 00:08 صبح
سلام
مسير برنامه اكسل رو در مثال زير درست كنيد
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

Private Const INFINITE = -1&
Private Const SYNCHRONIZE = &H100000

Private Sub Command1_Click()

Dim iTask As Long, ret As Long, pHandle As Long

iTask = Shell("C:\EXCEL.EXE", vbNormalFocus)
pHandle = OpenProcess(SYNCHRONIZE, False, iTask)
ret = WaitForSingleObject(pHandle, INFINITE)
ret = CloseHandle(pHandle)
MsgBox "Process Finished!"

End Sub

milad3em
شنبه 23 فروردین 1393, 01:56 صبح
جناب حامد ممنون از جوابتون من کد شما رو به شکل زیر در آورد اما ارور زیر را می دهد
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

Private Const INFINITE = -1&
Private Const SYNCHRONIZE = &H100000

Private Sub Command1_Click()
Dim iTask As Long, ret As Long, pHandle As Long
iTask = Shell(App.Path & "\BOOK2.XLSM", vbNormalFocus)
pHandle = OpenProcess(SYNCHRONIZE, False, iTask)
ret = WaitForSingleObject(pHandle, INFINITE)
ret = CloseHandle(pHandle)
MsgBox "Process Finished!"
end sub
INVALID PROCDURE CALL OR ARGUMENT

vbhamed
شنبه 23 فروردین 1393, 08:51 صبح
سلام
خب معلومه، چون دستور Shell فرمانهاي سيستم رو اجرا مي‌كنه و بايد اسم خود برنامه اكسل رو بهش مي‌داديد نه فايل اكسلتون
براي كاري كه شما مي‌خواين از روش زير استفاده كنيد
حتما اسم و مسير برنامه اكسل رو بدين
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) 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 ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Private Const INFINITE = -1&
Private Const SYNCHRONIZE = &H100000

Private Sub Command1_Click()

Dim iTask As Long, ret As Long, pHandle As Long

iTask = Shell("e:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE", vbNormalFocus)
ShellExecute Me.hwnd, "open", App.Path & "\book2.xlsm", "", "", 0
pHandle = OpenProcess(SYNCHRONIZE, False, iTask)
ret = WaitForSingleObject(pHandle, INFINITE)
ret = CloseHandle(pHandle)
MsgBox "Process Finished!"

End Sub

milad3em
شنبه 23 فروردین 1393, 09:35 صبح
فقط یه سوال دارم چرا excell رو hide نمی کنه iTask = Shell("e:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE", vbHide)

vbhamed
شنبه 23 فروردین 1393, 10:56 صبح
سلام
من كه تست كردم و hide شد
ولي اگر براي شما نميشه با استفاده از pHandle و توابع api مي‌تونيد hide كنيد، فكر كنم تابع Setwindowpos

milad3em
شنبه 23 فروردین 1393, 16:05 عصر
با سلامی دوباره خدمت شما
من اصل پروژه رو براتون ارسال کردم لطفا اگر امکانش هست یه بازبینی بفرمایید که چرا اکسل من مخفی نمی شود و اگر امکانش هست من اطلاعات رو از آدرس زیر میگیرم یکم این راه حل زمانبر است آیا راه حل دیگری به ذهن شما برای دریافت این اطلاعات از این آدرس وجود دارد
http://www.tsetmc.com/tsev2/excel/MarketWatchPlus.aspx?d=0

محسن واژدی
شنبه 23 فروردین 1393, 22:41 عصر
سلام علیکم
میتونید تنها از ShellExecute استفاده کنید

ضمیمه بررسی کنید

موفق باشید

milad3em
شنبه 23 فروردین 1393, 23:36 عصر
الان برنامه به خوبی کار می کنه فقط یه ایراد داره
قبل از اینکه نرم افزار بخواد فایل اکسل رو لود کنه من باید یک بار این فایل را اجرا کنم تا اسکریپت های آن یکسری عملیاتی رو که براش نوشتم انجام بدهند (لطفا یکبار فایل Book2.xlsm رو اجرا نمایید ) این اسکریپتها عبارتند از اتصال به اون سایتی که در پست های قبلی بیان کردم و ذخیره خودکار فایل اکسل و سپس بستن فایل که با یکبار اجرای فایل متوجه آن خواهید شد
اما الان این عملیات انجام نمیشه یعنی فایل اکسل اجرا نمی شود تا اسکریپت ها عملیات مورد نظر را انجام دهند .
با دستور shell که دوستمون اقا حامد بیان کرده بودند اون کار اجرا میشد اما برنامه اکسل نشون داده میشد من که برای برنامه درست نبود
اما برنامه شما بخوبی کار می کند ولی باید قبل از لود فایل در گرید مربوط یکبار فایل BOOK2.xlsm اجرا شود

---------------------------------------
حالا خارج از این راهکاری که من دارم آیا شما بوسیله adodc می توانید به این آدرس متصل شودی و اطلاعات را دریافت نمایید اگر اینطور شود خیل بهتر خواهد شد ( حالا یا adodc یا هر ابزار دیگری)

http://www.tsetmc.com/tsev2/excel/MarketWatchPlus.aspx?d=0

milad3em
یک شنبه 24 فروردین 1393, 10:29 صبح
دوستان کسی نظری نداره

vbhamed
یک شنبه 24 فروردین 1393, 12:38 عصر
سلام
من برنامه اي كه گذاشتيد رو تست كردم و بازم مشكلي نداشت
هم در Office 2003 و هم در Office 2010

milad3em
یک شنبه 24 فروردین 1393, 13:41 عصر
والا برای من hide نمیشه خود اکسل رو نشون میده

vbhamed
یک شنبه 24 فروردین 1393, 19:08 عصر
حالا خارج از این راهکاری که من دارم آیا شما بوسیله adodc می توانید به این آدرس متصل شويد و اطلاعات را دریافت نمایید اگر اینطور شود خیلي بهتر خواهد شد ( حالا یا adodc یا هر ابزار دیگری)

http://www.tsetmc.com/tsev2/excel/MarketWatchPlus.aspx?d=0
اين آدرسي كه شما دادين ديتابيس نيست كه بشه بهش متصل شد بلكه يك فايل اكسل هستش
شما مي‌تونيد فايل رو خودتون دانلود كنيد و اگر كامپوننتي داريد بازش كنيد و بعد هر كاري داريد روش انجام بديد
فايل شما مربوط به آفيس ورژن جديده اگر قديمي تر بود كامپوننتهايي داشتم كه بازش كنه ولي اينو نه
بايد با OLE بازش كنيد كه مي‌گيد خود برنامه اكسل رو نشون ميده به نظر من بايد اين مشكلتون حل بشه
اگر هم فايل رو خودتون در اين آدرس آپلود مي‌كنيد با تغيير ورژن فايل ميشه كارهايي كرد