PDA

View Full Version : Service Application فوری



mossaferin
یک شنبه 24 شهریور 1387, 12:48 عصر
سلام
من یک service applicaion نوشتم که برای مثال بتونه در مواقعی به کاربر یه پیغام (messagebox) بده یا یه کاری که با دسکتاپ انجام بده

که باید در این سرویس گزینه Interact with desktop فعال بشه که شده، و توی ویندوز XP کارشو انجام میده ولی توی ویستا پیغام روی دسکتاپ دیده نمیشه و ویندوز یه پیغام میده که یه برنامه میخواد یه چیزی نمایش بده و میره توی یه صفحه دیگه و پیغام و نمایش میده و باید کلید RETURN که خود ویندوز نمایش داده زده بشه تا برگرده توی دسکتاپ اصلی

چه جوری باید روی صفحه دسکتاپ اصلی ویستا توسط یه سرویس یه پیغام نمایش داد؟ یا از SCREEN کپچر گرفت.
ممنون

mossaferin
یک شنبه 24 شهریور 1387, 21:41 عصر
یعنی تاحالا هیچکس تو ویستا سرویس ننوشته ؟

ghabil
یک شنبه 24 شهریور 1387, 21:57 عصر
راستش من تا حالا توی یک سرویس ویندوز پیغام ندادم و ندیدم هم کسی بده ؛ چون یکی از تعاریف یک سرویس اینه که میتونه وقتی سیستم Log in نیست هم کار بکنه ، روش پیام دادن در سرویسها ثبت پیام در Log و دیدنش با Event Viewer هست. این یک روش طبق تعریف و استاندارد هست ،بخصوص که نمایش دیالگ موجب محتل شدن ادامه فعالیت سرویس میشه حتی شما باید خطاهارو هم Catch کنید و در System Log ذخیره کنید.
اجتمالا به همین دلایل هم توی ویستا این امکان کلا برداشته شده ولی همچنان اگر به کاری که میکنید اصرار دارید (که بهتره نداشته باشید) میتونید از ای پی آیCreateProcessAsUser استفاده کنید.

mossaferin
یک شنبه 24 شهریور 1387, 22:12 عصر
ممنون از راهنمایی شما ولی باید عرض کنم که پیغام دادن توسط یه سرویس رو به صورت مثال گفتم که البته امتحان هم کردم ، همان طوریه که گفتم و مشکل اینه که وقتی یه سرویس به شکل استاندارد نوشته می شه به دسکتاپ دسترسی نداره و نمیشه هندل دسکتاپ رو گرفت ،ولی وقتی Interact with desktop رو فعال کنی میشه. البته توی ویندوز های غیر ویستا
مشکل اصلی من هندل دسکتاپ اصلی ویستا ست که نمیشه بدست آورد یه دسکتاپ مجازی داره
دلیل اینکه مثال پیغام و زدم اینه که اگه امتحان کنید براحتی متوجه سوال من میشید
گرفتن هندل یه پنجره را توی یه سرویس هم همین طوریه بدون interact with desktop نمیشه
ممنون

ghabil
یک شنبه 24 شهریور 1387, 22:41 عصر
دوست عزیز این رو بخون : بنظرم ب توصیه MSDN کاملا منطقی تر که بجای سرویس از یک ویندوز اپلایکشن برای این کارها استفاده کنید ، به هر حالا فکر میکنم Interact with desktop در ویندوز Vista حذف شده ولی مطمئن نیستم ولی دات نت که خیالتو راحت کرده ، میتونی بگردی:


Windows Service applications run in a different window station than the interactive station of the logged-on user. A window station is a secure object that contains a Clipboard, a set of global atoms, and a group of desktop objects. Because the station of the Windows service is not an interactive station, dialog boxes raised from within a Windows service application will not be seen and may cause your program to stop responding. Similarly, error messages should be logged in the Windows event log rather than raised in the user interface.

The Windows service classes supported by the .NET Framework do not support interaction with interactive stations, that is, the logged-on user. The .NET Framework also does not include classes that represent stations and desktops. If your Windows service must interact with other stations, you will need to access the unmanaged Windows API. For more information, see Window Stations and Desktops in the Platform SDK documentation.

The interaction of the Windows service with the user or other stations must be carefully designed to include scenarios such as there being no logged on user, or the user having an unexpected set of desktop objects. In some cases, it may be more appropriate to write a Windows application that runs under the control of the user.

vcldeveloper
دوشنبه 25 شهریور 1387, 01:14 صبح
اگر واقعا نیاز هست که هم سرویس بنویسید، هم سرویس شما با کاربر تعامل داشته باشه، بهتر هست دو پروژه بسازید، یکی سرویس که کار خودش را انجام میده، و یک Windows Application ساده که هر زمان سرویس نیاز به تعامل با کاربر داشته باشه، پیامی (از هر طریقی) به برنامه ارسال میکنه و برنامه تعامل لازم با کاربر را انجام میده، و در صورت لزوم، نتیجه را به سرویس گزارش میده.

mossaferin
دوشنبه 25 شهریور 1387, 11:50 صبح
سلام
با تشکر از دوستان عزیز
پیشنهاد آقای کشاورز رو هم قبلا امتحان کردم جواب نداد، یا من نتونستم جواب بگیرم

AlirezaBahredar
سه شنبه 26 شهریور 1387, 09:01 صبح
راستش من تا حالا توی یک سرویس ویندوز پیغام ندادم و ندیدم هم کسی بده ؛ چون یکی از تعاریف یک سرویس اینه که میتونه وقتی سیستم Log in نیست هم کار بکنه ، روش پیام دادن در سرویسها ثبت پیام در Log و دیدنش با Event Viewer هست. این یک روش طبق تعریف و استاندارد هست ،بخصوص که نمایش دیالگ موجب محتل شدن ادامه فعالیت سرویس میشه حتی شما باید خطاهارو هم Catch کنید و در System Log ذخیره کنید.
اجتمالا به همین دلایل هم توی ویستا این امکان کلا برداشته شده ولی همچنان اگر به کاری که میکنید اصرار دارید (که بهتره نداشته باشید) میتونید از ای پی آیCreateProcessAsUser استفاده کنید.

با سلام....
درست هست که سرویس در واقع یک برنامه Backgroundهست اما همیشه لازم نیست که بدون فرم یا پیغام کارشو انجام بده.به همین منظور در دلفی برای هر دو این موارد(انجام عملیات بصورت مخفی و ارتباط با کاربر) دو نوع سرویس داریم:
1) Service
2)Service Application
سرویس تنها یک برنامه سرویس بدون هیچگونه فرم و یا امکان نمایش پیغام می باشد که هیچ UI ندارد.
اما Service Application علاوه بر داشتن خصوصیت سرویس به شما این امکان را می دهد که یک محیط UI را همانند سایر برنامه های عادی داشته باشید.
برای این منظور شما می توانید از منو
File>New>Othre...>Service or ServiceApplication
را انتخاب نمایید.
با تشکر.

ghabil
سه شنبه 26 شهریور 1387, 12:09 عصر
درست هست که سرویس در واقع یک برنامه Backgroundهست اما همیشه لازم نیست که بدون فرم یا پیغام کارشو انجام بده.به همین منظور در دلفی برای هر دو این موارد(انجام عملیات بصورت مخفی و ارتباط با کاربر) دو نوع سرویس داریم:
1) Service
2)Service Application


عزیز دل برادر یکبار پاراگراف اول متنی که از MSDN کپی کردم رو میخوندی بعد نظر میدادی بهتر نبود؟ :



Windows Service applications run in a different window station than the interactive station of the logged-on user.


در مورد نوشتن یک EXE هم که سرویس اجراش کنه بازهم ممکن نیست چون همینطوری که توی متن کپی شده هست ، Context و Session یوزر سرویس از یوزر Log in شده مجزاست (مگر اینتراکت زده شده باشه). اما میشه در یک پروسه (هر پروسه ای ) با گرفتن Principle Token یک یوزر فعال دیگه پروسه ای رو در Session اون یوزر انجام داد که راهش همون استفاده از CreateProcessAsUser که عرض کردم ، یعنی سرویستون فایل EXE رو در Context یوزر Login شده اجرا کنه.