PDA

View Full Version : سوال: ارسال پیغام از سرویس به برنامه فرم دار



Mask
جمعه 27 دی 1392, 02:34 صبح
سلام.
در ویندوز xp به علت اینکه سرویسها خاصیت InterActive نداشتند ، سرویسها و برنامه ها در یک دسکتاپ و پنجره اجرا میشدند، و به راحتی از یک سرویس بوسیله SendMessege پیغامی به فرم برنامه ای ارسال میشد.
اما در ویندوزهای ویستا به بالا ، با دارا شدن خاصیت InterActive سرویسها ، این برنامه ها در پنجره و دسکتاپی خارج از محیط دسکتاپ ما اجرا میشوند . زمانی که از سرویسی تلاش در ارسال پیغامی به برنامه ای میکنیم، چون بوسیله تابع FindWindow اقدام به جستجوی فرم مورد نظر میکند ، اما فرم قابل شناسایی نیست.چون اون فرم و برنامه در دسکتاپ دیگری فعال هست .
به نظرتون با این مشکل چطوری میشه به برنامه ها پیغام ارسال کرد .
البته بعد از جستجو ، در مورد ارسال پیغام به ترد و یا هوک و ... مواجه شدم، که متاصفانه نتیجه ای نداشت .
نظر دوستان چیه؟

یوسف زالی
جمعه 27 دی 1392, 22:15 عصر
You cannot send window messages to a service. For one, services do not have a UI of their own, let alone windows. And second, even if you add your own hidden window to the service (actually, Delphi-based services do have the hidden TApplication window), window messages are not allowed to pass over session boundaries (services run in a separate session than user-mode applications).

There are many IPC (interprocess communications) mechanisms that work with services - named pipes, mailslots, TCP/IP and UDP sockets, just to name a few. You will have to use one of those instead.

از قول SO، یکی از راههاش استفاده از سوکته.

Felony
جمعه 27 دی 1392, 22:48 عصر
گزینه فنی همون Named Pipe ها هستن که تو متن قرار داده شده در پست قبل هم بهشون اشاره شده ، تو Document های مرتبط با WCF هم استفاده از این روش پیشنهاد میشه ، استفاده از TCP هم جالب نیست .

برای اون کاری هم که میخواستی انجام بدی همون Event Log و رجیستر کردن یک Event که بهت گفتم بهترین گزینه هست .

اینم یک نمونه پیاده شده با #C :

http://windowsservice.codeplex.com/

Mask
جمعه 27 دی 1392, 23:30 عصر
ممنون از همه.
دادا مجتبی :
فکر کنم یکم بد توضیح دادم. ببینید من نمیخام مشکلات یا وضعیت سرویس رو گزارش کنم که .(احساس میکنم شما منظور من رو از این باب گرفتید که Event Viwer رو پیشنهاد کردید.)
سرویس برنامه من داره از کلاینت دیتا میگیره و کپچر میکنه . میخام این دیتا رو بتونم داخل برنامم که فرم داره ،هم ببینم. یعنی دیتای دریافتی از کلاینتها که توسط سرویس گرفته میشه . و ربطی به شرایط سرویس نداره.
دادا یوسف :
از IPC استفاده کردم، اما متاصفانه با ویندوز 64 بیت مشکل پیدا کردم. البته من از IPC پکیج MAD استفاده کردم. و یه یونیت دیگه هم که مدعی این موضوع بود رو هم بررسی کردم که جواب نداد.
و اینکه در کامنتی که زحمت کشیدید و گزاشتید : توضیح در این مورد هست که از برنامه به سرویس پیغام ارسال بشه ، در صورتی که موضوع کار من ،دقیقا برعکسه و میخام از سرویس به برنامه پیغام ارسال کنم.
البته با همه تحقیقاتی که کردم و فرمایشات شما دو دوست عزیزم ، احساس میکنم استفاده از NamedPipe و udp گزینه های بدی نباشند .
البته UDP رو که آشنا هستم، اگه ممکنه در مورد NamedPipe هم توضیحی اگر مقدور هست بفرمایید.

Mask
جمعه 27 دی 1392, 23:50 عصر
دم همتون گرم . با udp زدم به قول دادا یوسف مثه ساعت داره کار میکنه.
بازم ممنون.

بهروز عباسی
شنبه 28 دی 1392, 00:13 صبح
درود
خود من هم درگیر چنین چیزی هستم.

این کد رو توی کاسه کوزم داشتم (Named Pipes unit for Delphi) متاسفانه منبعش رو ندارم :(.

* تست نکردم.

Felony
شنبه 28 دی 1392, 05:51 صبح
فکر کنم یکم بد توضیح دادم. ببینید من نمیخام مشکلات یا وضعیت سرویس رو گزارش کنم که .(احساس میکنم شما منظور من رو از این باب گرفتید که Event Viwer رو پیشنهاد کردید.)
اخوی به من گفتی میخوای وضعیت سرویس رو تو برنامت داشته باشی ، من اون مورد رو پیشنهاد دادم .

اگر میخوای دیتا تبادل کنی راه درست همون Named Pipes یا Shared Memory هست ، که من همون اولی رو پیشنهاد میدم ، در مورد UDP هم کار رو راه میندازه ولی فکر باقی جاهاش هم باش ، یادمه قبلا برنامه ای که همین کار رو انجام میداد ، سرویس درست استارت میشد و تو لاگ ها ویندوز همه چیز درست بود ولی برنامه چیزی نشون نمیداد ، بعد 2 روز کلنجار رفتن فهمیدم طرف تو سرویس از UDP استفاده کرده و Kaspersky بلاکش کرده و نمیزاره دیتا از مبدا ( سرویس ) به مقصد ( کلاینت ) ! برسه .

Mask
شنبه 28 دی 1392, 13:43 عصر
اخوی به من گفتی میخوای وضعیت سرویس رو تو برنامت داشته باشی ، من اون مورد رو پیشنهاد دادم .

اگر میخوای دیتا تبادل کنی راه درست همون Named Pipes یا Shared Memory هست ، که من همون اولی رو پیشنهاد میدم ، در مورد UDP هم کار رو راه میندازه ولی فکر باقی جاهاش هم باش ، یادمه قبلا برنامه ای که همین کار رو انجام میداد ، سرویس درست استارت میشد و تو لاگ ها ویندوز همه چیز درست بود ولی برنامه چیزی نشون نمیداد ، بعد 2 روز کلنجار رفتن فهمیدم طرف تو سرویس از UDP استفاده کرده و Kaspersky بلاکش کرده و نمیزاره دیتا از مبدا ( سرویس ) به مقصد ( کلاینت ) ! برسه .
عذرخواهی میکنم. احتمالا من بد توضیح دادم.
در مورد موضوع udp هم حق با شماست.
فعلا با udp پروژه رو استارت کردم. اما دارم روی pipe هم کار میکنم.