PDA

View Full Version : سوال: اجرا نشدن هیچ دیالوگ و فایلی در Application Service



AliReza Vafakhah
دوشنبه 22 فروردین 1390, 01:07 صبح
سلام دوستان

یک سرویس نوشتم که در موارد خاصی یک فایل Exe را اجرا کند ، کد ShellExecute مربوط به اجرای فایل exe در یک application Form به درستی کار میکنه اما وقتی در سرویس استفاده می کنم فایل مربوطه اجرا نمیشه ، من احتمال میدم به خاطر این باشه که پارامتر اول تابع ShellExecute که یک هندل می خواهد رو سرویس نداره و من که هندل رو برابر 0 قرار دادم فایل اجرا نمیشه ، دوستان در ضمن من نمیتونم هیچ دیالوگی (مثل messageBox )در سرویس به نمایش بگذارم در صورتی که الباقی کدها به درستی کار می کنند.

ShellExecute(0 {Service dos not Handle} ,'open','C:\A.exe',
nil, nil, SW_SHOWNORMAL);

ویندوز من Win7 64bit هست

لطفا دوستان هم یک تست ساده بزنند.

AliReza Vafakhah
دوشنبه 22 فروردین 1390, 21:34 عصر
عجیب هست دوستان کسی راه حلی نداره که بشه یک فایل Exe را از طریق یک سرویس اجرا کرد؟

من که خوب گشتم متوجه این شدم که سرویس باید با دسکتاپ interact باشه که این کار را کردم و در ضمن از CreateProcess برای اجرای فایل Exe استفاده کردم و خوشبختانه فایل اجرا میشه اما چون سرویس Parent فایل مربوطه میشه ، فایل exe به نمایش گذاشته نمیشه و اگر با Process Explorer هم Bring to Front کنم ، Process Explorer پیغام میده که این فایل هیچ پنجره ای ندارد!

دوستان لطفا راهنمایی کنید که چگونه میشه Parent یک فایل Exe را تغییر داد (بشه همون Explorer.Exe).

a_mosavian
سه شنبه 23 فروردین 1390, 00:16 صبح
گمان کنم این جستار کمکت کنه
http://www.delphipages.com/forum/showthread.php?t=208020&highlight=runas
در کل برای اینکه کنترل بیشتری روی گزینه ها داشته باشی از متد CreateProcess بهره بگیر.

vcldeveloper
سه شنبه 23 فروردین 1390, 00:28 صبح
قبلا چندین بار توضیح دادم که سرویس ها در یک Session جدا اجرا میشند، و به رابط کاربر دسترسی ندارند. برنامه ایی که شما با ShellExecute اجرا می کنید، در یک Session دیگه و یک دسکتاپ دیگه اجرا میشه، پس نمی بینیدش.

AliReza Vafakhah
سه شنبه 23 فروردین 1390, 00:52 صبح
قبلا چندین بار توضیح دادم که سرویس ها در یک Session جدا اجرا میشند، و به رابط کاربر دسترسی ندارند. برنامه ایی که شما با ShellExecute اجرا می کنید، در یک Session دیگه و یک دسکتاپ دیگه اجرا میشه، پس نمی بینیدش.

خوب آقای کشاورز الآن باید چیکار کرد که برنامه مربوطه به نمایش گذاشته بشه ، من که با SetParent هم نتونستم Parent فایل exe را تغییر بدم .

به این تاپیک (http://barnamenevis.org/showthread.php?220090-%D9%85%D8%B4%DA%A9%D9%84-%D8%B3%D8%B1%D9%88%DB%8C%D8%B3-%D9%87%D8%A7-%D8%AF%D8%B1-%D9%88%DB%8C%D9%86%D8%AF%D9%88%D8%B2-7)هم مراجعه کردم ، اما باز هم مشکل عدم نمایش پنجره Exe هست.!



در کل برای اینکه کنترل بیشتری روی گزینه ها داشته باشی از متد CreateProcess بهره بگیر.

در پست قبلی ذکر کردم که با CreateProcess هم مشکل رفع نشد!

vcldeveloper
سه شنبه 23 فروردین 1390, 13:38 عصر
خوب آقای کشاورز الآن باید چیکار کرد که برنامه مربوطه به نمایش گذاشته بشه ، من که با SetParent هم نتونستم Parent فایل exe را تغییر بدم .
ربطی به Parent نداره.
به طور پیش فرض سرویس ها نمی تونند با کاربر تعامل داشته باشند. شاید اگر سرویس تون رو به صورت Interactive تعریف کنید، بتونید کاری کنید. ولی به طور کلی، بهتره که سرویس شما تعاملی با کاربر نداشته باشه، و وقتی میخواد با کاربر تعاملی برقرار کنه، با یک برنامه واسط ارتباط برقرار کنه، و اون برنامه با کاربر تعامل داشته باشه. اگر بخواید فارغ از توصیه ها، اصرار به نمایش رابط گرافیکی برای کاربر فعلی داشته باشید، باید به نوعی از طریق اون سرویس به دسکتاپ فعلی کاربر دسترسی پیدا کنید (منظورم پنجره مربوط به دسکتاپ نیست، بلکه شی دسکتاپ هست)، و برنامه مورد نظر رو در این دسکتاپ اجرا کنید. البته اون کار هم به مجوزهای سرویس شما بستگی داره.

AliReza Vafakhah
سه شنبه 23 فروردین 1390, 14:51 عصر
با یک برنامه واسط ارتباط برقرار کنه، و اون برنامه با کاربر تعامل داشته باشه.

من هم می خواهم همین برنامه واسط را از طریق سرویس اجرا کنم که با مشکل مواجه هستم.

سرویس را هم به صورت Interactive تعریف کردم.

Felony
سه شنبه 23 فروردین 1390, 17:32 عصر
تو تاپیک نمونه سورسها یک برنامه قرار داده بودم با نام Mesktop که چند تا میز کار میساخت ، سورس اون رو مطالعه کنید ، نحوه اجرای یک پروسه در یک میزکار دیگه رو میتونید یاد بگیرید .

vcldeveloper
سه شنبه 23 فروردین 1390, 19:06 عصر
من هم می خواهم همین برنامه واسط را از طریق سرویس اجرا کنم که با مشکل مواجه هستم.
خب اون برنامه رو سرویس نباید اجرا کنه، بلکه اون برنامه رو باید مستقل از سرویس، تحت حساب کاربر جاری، اجرا کنید (مثلا از طریق منوی Startup). اون وقت با استفاده از روش های مختلف IPC (مثل Pipe و غیره) بین سرویس و این برنامه ارتباط برقرار کنید.


سرویس را هم به صورت Interactive تعریف کردم.
دقت کنید که تعریف سرویس های Interactive فقط برای backward compatibility در ویندوز حفظ شده، و سرویس های جدید نباید به صورت Interactive تعریف بشند.

AliReza Vafakhah
پنج شنبه 25 فروردین 1390, 23:23 عصر
خب اون برنامه رو سرویس نباید اجرا کنه، بلکه اون برنامه رو باید مستقل از سرویس، تحت حساب کاربر جاری، اجرا کنید (مثلا از طریق منوی Startup). اون وقت با استفاده از روش های مختلف IPC (مثل Pipe و غیره) بین سرویس و این برنامه ارتباط برقرار کنید.


آقای کشاورز میشه در رابطه راتباط بین سرویس و برنامه یا همان IPC بیشتر توضیح بدهید. با جستجو روش pipe چیزی دستگیرم نشد.


دقت کنید که تعریف سرویس های Interactive فقط برای backward compatibility در ویندوز حفظ شده، و سرویس های جدید نباید به صورت Interactive تعریف بشند.

backward compatibility در این مورد هم اگه میشه بیشتر توضیج بدهید.

تشکر

vcldeveloper
جمعه 26 فروردین 1390, 13:06 عصر
آقای کشاورز میشه در رابطه راتباط بین سرویس و برنامه یا همان IPC بیشتر توضیح بدهید. با جستجو روش pipe چیزی دستگیرم نشد.

IPC یعنی Inter-process Communication که به مجموعه تکنیک های تبادل داده بین پروسه های مختلف در حال اجرا در سیستم گفته میشه. تکنیک های مختلفی برای این نقل و انتقال داده وجود دارند، مثل ارسال پیام به یک پنجره مربوط به یک پروسه خاص (در مورد شما کاربرد نداره)، استفاده از Mapped Files، استفاده از Pipes، استفاده از RPC، و غیره. اگر Pipes رو در MSDN جستجو کنید، درباره اش توضیحات لازم داده شده. برای استفاده کردن ازش هم مثال های مختلف به دلفی و سایر زبان های برنامه نویسی در اینترنت و البته در همین سایت، موجود هست.


backward compatibility در این مورد هم اگه میشه بیشتر توضیج بدهید.
Backward compatibility یعنی سازگاری با نسخه های گذشته؛ درباره یک سیستم عامل مثل ویندوز، یعنی امکان اجرای برنامه های قدیمی توسط نسخه های جدیدتر ویندوز. درباره سرویس ها، با توجه به اینکه حالت Interactive در نسخه های قدیمی ویندوز وجود داشته، و بعضی برنامه نویسان از اون برای توسعه برنامه هایشان استفاده کردند، در نسخه های جدید ویندوز (ویستا و 7) این قابلیت برای حفظ سازگاری با اون نرم افزارهای قدیمی حفظ شده، اما از برنامه نویسان خواسته شده که در برنامه های جدیدشان روی این قابلیت حساب نکنند؛ یعنی ممکنه در ویندوز 8، یا نسخه های بعدی ویندوز، این قابلیت کلا غیرفعال بشه.