# Native Code > برنامه نویسی در Delphi > مقالات مرتبط با Delphi/Win32 >  چگونگی کار با service application در دلفی

## omid_hasanpur

دوستان سلام
می خواستم در مورد چگونگی نوشتن یک سرویس در دلفی و کاربردهای آن مطالبی بنویسم
اگر علاقه مند هستید بگویید تا ادامه بدهم

----------


## مهدی کرامتی

نیکی و پرسش؟  :)

----------


## omid_hasanpur

خوب ابتدا توضیحی کوتاه در مورد service  ها :
حتما تا کنون در windows xp   پیش آمده که کلیدهای cntrl+Alt+Delete را فشار دهید.
با این کار صفحه Windows task manager باز میشود و یکی از tab های آن Processes 
می باشد.در این tab تعدادی برنامه با پسوند EXE که در حال حاضر در حال اجرا بر روی کامپیوتر شما هستند همراه با درصدی از cpu و memory که توسط هر کدام از آنها مورد استفاده قرار می گیرد نشان داده شده اند. 
اگر با دقت بیشتری به این لیست نگاه کنید متوجه خواهید شد که تعدادی از برنامه های نصب شده بر روی سیستم شما به همراه سرویسهایی که وظیفه انجام امور اصلی و داخلی windows   را بر عهده دارند در این لیست قرار گرفته اند.
حال به عنوان یک برنامه نویس دلفی آیا ما میتوانیم یک Service برای برنامه خود ایجاد کنیم و مزیت و کاربردهای برنامه نویسی به صورت سرویس چیست؟
جواب سوال اول مثبت است.به قول برنامه نویسان متعصب دلفی که من هم عضو کوچکی از آنها هستم پادشاه و یگانه سلطان زبانهای برنامه نویسی  از اول خلقت کدنویسی همانا دلفی عزیز و اجداد گرامش هستند :تشویق: .
مثل اینکه از بحث دور شدیم.
همانطور که گفتم ما می توانیم در دلفی service مورد نظر خود را ایجاد کنیم.
کافی است در File/New گزینه Service Application  را انتخاب کرده و آنگاه منتظر شاهکار دلفی بمانیم.لازم به ذکر است که من این موضوع را در دلفی هفت توضیح می دهم.
وقتی یک Service در ویندوز نصب می شود در پشت پرده و بدون اینکه نیازی به متوجه بودن کابر باشد اعمال مورد نظر برنامه نویس انجام می شود.در حقیقت یک Service را می توان به منزله یک ربات دانست که امور محوله را به نحو احسن در سیستم انجام میدهد.
برای روشن شدن موضوع یک مثال میزنم : یکی از سرویسهایی که می توان مثال زد سیستم هشدار در ساعت معین است.اگر این برنامه به صورت یک سرویس نوشته شود و در مجموعه سرویسهای ویندوز نصب شود هر بار پس از روشن شدن سیستم به صورت اتوماتیک بارگزاری شده و منتظر روی دادن تاریخ و ساعت معین میشود.در صورت رسیدن به آن زمان پیام یا آلارمی که قبلا تعریف شده است را اجرا میکند.
یکی از بهترین مزیت های برنامه نویسی به صورت سرویس این است که اگر یک سرویس بر روی سیستمی در حال اجرا باشد حتا اگر آن سیستم در حالت Log off  هم قرار داشته باشد سرویس مورد نظر وظیفه خود را به خوبی انجام میدهد.مثلا در مثال قبلی فرض کنید موقع هشدار وقتی باشد که کامپیوتر  Log off است.
 در این صورت باز هم سرویس  آلارم مورد نظر را پخش خواهد کرد.
مثل اینکه زیادی صحبت کردم. انشاء الله در مورد چگونگی نوشتن سرویس در دلفی و همچنین مزیتهای دیگر این نوع برنامه نویسی باز هم مینویسم البته به شرطی که نظر بدهید و اگر جایی اشتباهی دارم به من تذکر دهید.منتظر نظرات شما هستم.

----------


## omid_hasanpur

با تشکر از دوستانی که باعث تشویق من در ادامه این موضوع شدند بحث را ادامه می دهم :
امروز در مورد ساختن یک پروژه آزمایشی صحبت میکنم. پس بدون مقدمه اضافی کار را شروع می کنیم.
دلفی عزیز را باز کنید و از تب File/New گزینه Service Application  را انتخاب فرمایید.
با این کار پروژه جدیدی باز می شود که شامل یک module به نام Service1 می باشد که کامپوننتهای مورد نیاز خود را می توانید روی آن قرار دهید.
شما در پروژه خود یک شی از نوع Tservice1 دارید که قسمت اصلی کار ما می باشد.
در object inspector خاصیت displayname سرویس خود را به Mytstsrv تغییر دهید.این نامی است که سرویس با آن نمایش داده می شود و در ادامه متوجه نقش آن خواهید شد.
حال اول ببینیم دوست داریم این سرویس چه عملی برای ما انجام دهد.بیایید یک کار ساده از سرویس خود بخواهیم.به این صورت که هر 10 ثانیه یک مرتبه پیامی نمایش داده شود.
پس برای این منظور از تب system یک timer به پروژه خود اضافه کنید و خاصیت Interval آنرا روی 10000 تنظیم کنید.
در ادامه در on timer مربوط به شی timer کد زیر را وارد کنید:
Showmessage&#40;‘My Service is work currently!!’&#41;;
خوب همین!!.
حال بیایید سرویس خود را اجرا کنیم. برای اینکه سرویسی که نوشته اید بر روی سیستم نصب شود باید  آنرا  با پارامتر /Install اجرا کنید. پس به قسمت Run/Parameters رفته و در محل Parameters این عنوان را اضافه کنید :/install  
حال اگر برنامه را Run  کنید سرویس شما بر روی کامپیوتر نصب می شود.
برای اینکه سرویس خود را ببینید به Control Panel/Administrative Tools رفته و وارد Services شوید.
در این پنجره کلیه سرویسهایی که روی کامپیوتر شما Install شده اند نشان داده می شود.
حال به دنبال سرویس خود با نام Mytstserv بگردید.
پس از یافتن آنرا انتخاب کنید و در سمت چپ گزینه Start  را انتخاب کنید.با این کار Service شما اجرا 
می شود و شروع به اجرای فرامین شما می کند.
لازم است این را هم اضافه کنم که شما در خود پروژه هم می توانید با دستوری پس از Install شدن سرویس آنرا اجرا کنید که در فرصت مناسب به آن اشاره خواهم کرد.
خوب پس از طی مراحل فوق سرویس آماده خدمت گزاری به شماست.از این پس هر بار پس ازروشن شدن کامپیوتر به صورت خودکار سرویس شما Start شده و ماموریت خود را در پشت پرده انجام می دهد. 
یک نکته دیگر باقی مانده و آن هم طریقه UnInstall کردن سرویسمان است.
برای این کار ابتدا به Services بروید و پس از انتخاب سرویس خود از سمت چپ گزینه Stop  را انتخاب کنید.حال سرویس خود را اینبار با پارامتر /UnInstall   اجرا کنید. پیامی مبنی بر اینکه سرویس از سیستم حذف شد دریافت خواهید کرد.
البته هنوز موارد ناگفته زیادی باقی مانده که اگر عمری باقی بود به مرور بیان میکنم.
خوب فکر کنم حسابی کیف کردید.من که وقتی اولین سرویس خود را نوشتم خیلی ذوق زده شدم.امیدوارم شما حتما حتما سراغ دلفی رفته و سرویس نویسی را امتحان کنید و نتایجی که بدست می آورید را در اینجا برای بقیه بازگو کنید.من منتظرم.
حال کمی قوه تخیل خود را پرواز بدهید و ببینید با یک سرویس چه کارهایی می توان انجام داد:
یکی را من می گویم. شما می توانید یک روباط هوشمند طراحی کنید.آنرا در کامپیوتر خود قرار دهید و سپس از طریق اینترنت به کامپیوترتان وصل شده و از راه دور سیستم خود را کاملا هدایت کنید.
البته این کار مستلزم دانستن روش کار با کامپوننتهای دیگر دلفی هم هست که اگر من اینجا ماندگار بودم و دوستان علاقه داشتند در مورد آنها هم صحبت خواهم کرد.
شما هم ایده های خود را در مورد وظایفی که یک سرویس می تواند انجام دهد بیان کنید تا بهترین آنها را انتخاب کرده و به کمک هم آنرا پیاده سازی کنیم.
پس عجله کنید و دوگوله خودتونو به کار بندازید.:mrgreen: 
فعلا Bye .

----------


## saeed_d

دوست عزیز سلام
با تشکر از مطلب جالبتان.
متاسفانه تمام کارهاپی را که نوشته بودید انجام دادم . بعد از Start کردن سرویس در Services هیچ اتفاقی نیافتاد. یعنی پس از 10 ثانیه پیغامی ظاهر نشد. مشکل از کجا می‌تواند باشد؟  :گیج:  
 :تشویق:   :flower:

----------


## m_reza

منم همین مشکل را دارم ( بعد از Start کردن هیچ سرویسی اجرا نشد ) :(

----------


## omid_hasanpur

با عرض پوزش از همگی دوستان. من مهمترین نکته در نوشتن سرویس را فراموش کردم بگویم.لطفا ابتدا به services درcontrol panel رفته و سرویس خود را بیابید و آنرا stop کنید.
سپس دلفی را اجرا نموده و برنامه ای که نوشته اید را باز کنید و آنرا با /uninstall اجرا کنید.
حال در on execute مربوط به service (یکی از event های سرویس است) کد زیر را وارد کنید :
  while not Terminated do
      ServiceThread.ProcessRequests&#40;True&#41;;// wait for termination
در ادامه برنامه را به روشی که قبلا شرح داده ام اجرا کنید. حتما موفق می شوید.
لطفا نتیجه را حتما حتما بگویید.
الان متاسفانه فرصت توضیح ندارم اگر خواستید بگویید تا کد بالا را توضیح دهم.
منتظر نظرات شما هستم.
خداحافظ

----------


## saeed_d

سلام
باز هم مشکل من حل نشد  :گیج:  
اگه ممکنه توضیح بیشتری بدهید
متشکرم

----------


## omid_hasanpur

سلام
لطفا در OnStartمربوط به Serviceخود یک showmessageقرار دهید.باید بعد از نصب سرویستان و پس از هر بار بالا آمدن ویندوز آن پیام نشان داده شود .
اگر پیام درست نشان داده شد مشخص می شود که شما سرویس را درست نوشته و نصب کرده اید.
در غیر اینصورت یکبار دیگر کد سرویس خود را بررسی کنید.

----------


## m_reza

کد قبلی را امتحان کردم، اما باز هم فایده ای نداشت.  :(

----------


## omid_hasanpur

کدام کد را امتحان کردید؟
آیا سرویس شما در لیست سرویسها قرار می گیرد؟

----------


## m_reza

تمام مراحلی را که گفتید پیاده سازی شد . پس از اجرای برنامه پیغام نمایش داده می شود اما این سرویس به لیست سرویس های ویندوز اضافه نشده و پس از نمایش پیغام برنامه بسته می شود .

----------


## omid_hasanpur

اگر پیامی که در onstartسرویس خود قرار داده اید را بعد از هر بار راه اندازی مجدد ویندوز مشاهده می کنید نشان می دهد که سرویس شما نصب است.
برای آگاه شدن از این موضوع شما دو کار می توانید انجام دهید.
یکی اینکه سرویس خود را بار دیگر با install/اجرا کنید در این صورت باید پیغام خطایی مبنی بر اینکه این سرویس در حال حاضر بر روی سیستم شما نصب است را دریافت کنید .
راه دوم این است که به control panel/administrative tools/servicesبروید و در لیست سرویسهای موجود دنبال نام سرویس خود که در قسمت display nameوارد کرده بودید بگردید اگر آنرا پیدا کردید مشخص می شود که سرویس شما نصب شده است.
در ضمن بار اولی که سرویس خود را با install/جرا می کنید باید پیام زیر را دریافت کنید که نشانگر آن است که سرویس شما با موفقیت نصب شده است :
service installed successfuly
شما آیا پیام بالا را دریافت کرده اید؟
Bye. :wink:

----------


## m_reza

خیر. همچین پیامی دریافت نمی کنم.

----------


## m_reza

بالاخره مشخص شد که اشکال در نوشتن عبارت Install بود . شما گفته بود عبارت /Install اجرا کنیم. در صورتیکه نحوه نوشتن به این صورت است install/  . در هر صورت این سرویس اجرا شد  و در لیست سرویسهای ویندوز نیز قرار دارد . در ابتدای اجرای آن هم پیغامی مبنی بر با موفقیت بودن کار نمایش داده می شود.

حال زمانی که ویندوز مجددا اجرا می شود این سرویس در لیست سرویس ها قرار دارد و در حالت Start نیز می باشد اما مشکل این است که رویداد مورد نظر  را انجام نمی دهد. یعنی در مثالی که شما زدید Showmessege با بازه زمانی هر 10 ثانبه یکبار اجرا نمی شود . این در حالیست که اگر برنامه را دوباره اجرا کنیم (منظورم سرویس نیست ) آن پیغام برای 2 بار اجرا شده ( دو بار پیغام نمایش داده می شود ) و دیگر اجرا نمی شود .

----------


## hghodsi

چگونه می توان در این سرویس یک یا چند برنامه را اجرا کرد ؟ یعنی مثلا یک یا چند برنامه exe  در زمانها مختلف ؟ :flower:

----------


## omid_hasanpur

با دستور winexecمی توانید فایلهای exeرا اجرا کنید ولی منظورتان از زمانهای مختلف را نمی فهمم.
bye

----------


## hghodsi

مثلا در ساعت 14 برنامه شماره 1 شروع و 30 دقیقه بعد پایان یابد یا هر یک دقیقه یکبار اجرا شود.

----------


## BOB

سلام. 
این بحث کم کم داره خطرناک میشه . مواظب باشید به سمت مصارف illegal منحرف نشه .
در هر صورت از مقاله مفیدتون متشکرم.

----------


## omid_hasanpur

همونطوری که گفتم شما با دستور winexecمیتونید این کارو انجام بدین
دقیقا چه کاری میخواهید انجام بدین؟

----------


## MiRHaDi

سلام
منم میکنم نمیشه !
توی لیست میاد
Start میشه ( اگه توی onstart هیچی نباشه ) اگه باشه میگه نمیتونم
کاری نمیکنه !
دوباره که اجرا میکنم 2 3 تا میسیج خودم میاد
بعد هم هیچی
بای

----------


## shayan_delphi

سلام
اگر تا مرحله مربوط به تاپیک7# را انجام بدید و مقدار پارامتر را Install/  و خاصیت Interactive=True (در Object inspector) تنظیم کنید مشکل حل می شود.

----------


## MiRHaDi

سلام
بقیه این مقاله چی شد ؟
بای

----------


## realman

میشه لطف کنید این مقاله رو ادامه بدید.واقعا جالب بود.
متشکرم.

----------


## saeed_d

سلام
من مطالب این تاپیک رو جمع آوری کردم و اینجوری تونستم یه ServiceApplication یسازم که هر 10 ثانیه یه پیغام رو نشون بدهد:

برای نوشتن یک Service Application که بتواند هر 10 ثانیه یک پیغام نشان دهد:
ابتدا از منوی file گزینه New را انتخاب کرده و سپس روی گزینه Other کلیک کنید بعد در پنجره باز شده از سربرگ New گزینه ServiceApplication را انتخاب کنید. با انجام این کار یک کلاس با نام TService1 ایجاد می شود که می توانید با قرار دادن هر شیء مورد دلخواه بر روی فرم آن برنامه خود را بنویسید. برای برنامه ما از سربرگ System یک Timer بر روی سرویس گذاشته و خاصیت Interval آن را 10000 بگذارید. حال در رویداد OnTimer کد زیر را بنویسید:
Showmessage('My Service is worked currently');
خاصیت DisplayName مربوط به Service1 را به MyTstSrv تغییر دهید. این نام بعد از اجرای سرویس در لیست سرویسها ظاهر می شود.
خاصیت Interactive مربوط به Service1 را به True تغییر دهید.
در رویداد OnExecute مربوط به Service1 کد زیر را بنویسید:
while not Terminated do
       ServiceThread.ProcessRequests(True);// wait for termination
حال موقع نصب سرویس بر روی ویندوز رسیده است. برای اینکار باید برنامه را با پارامتر /install اجرا کنید. پس در دلفی به منوی Run رفته و روی گزینه Parameters کلیک کنید. در این پنجره در کادر مربوط به Parameters عبارت /install را تایپ کنید و روی Ok کلیک کنید. حال برنامه را اجرا کنید. اگر همه مراحل را بدرستی انجام داده باشید پیغام Service installed successfully ظاهر می شود.
حال باید به لیست سرویسهای ویندوز بروید و سرویس خود را Start کنید. (این سرویس می تواند با restart شدن ویندوز نیز Start شود) برای این کار به Control Panel رفته و پنجره Administrative Tools را باز کنید. در این پنجره روی گزینه Services دابل کلیک کنید. با انجام این کار یک پنجره باز می شود که نام تمامی سریسهای نصب شده برروی ویندوز وجود دارند. نام MyTstSrv را پیدا کرده و روی آن کلیک راست کنید و سپس گزینه Start را انتخاب کنید. با انجام این کار سرویس شما Start شده و باید هر 10 ثانیه یکبار پیام شمار را نمایش دهد.
برای حذف کردن سرویس از روی ویندوز باید برنامه را با پارامتر /Uninstall اجرا کنید. با انجام این کار پیام Service Uninstalled Successfully ظاهر می شود.

----------


## saeed_d

با عرض معذرت در نوشته های بالا علامت / را قبل از install و uninstall بنویسید

----------


## hojjatcroos

چند تا سوال داشتم فرق Service و Service Appilications چیه و پارامترهای Service Type و Start Type چه کاربردی دارند.

----------


## MOJTABAATEFEH

در لسيت proccess هاي ويندوز به اسم ديگري نشان داده ميشه و اينكه با end كردن آن سرويس مورد نظر Stop مي شود چطور مي توان با همان اسم در TaskManager نمايشش داد و اينكه با End كردن از كار نيفته و دوباره اجرا شود مثل بعضي Service هاي خود ويندوز كه بسته مي شوند و براي لحظه اي از ليست Proccess ها حذف مي شوند اما دوباره اجرا مي شوند

با تشكر

----------


## 1485159

من توی نصب کردن سرویس مشکل دارم، وقتی مینویسم:
install
هیچ اتفاقی نمیافته ولی وقتی مینویسم:
/install
با خطای زیر مواجه میشم:

----------


## siavash_fe

سلام به همه 
کسی رو windows 7 سرویس نصب کرده .
نصب نمیشه باید چکار کرد

----------


## mossaferin

سلام 




> کسی رو windows 7 سرویس نصب کرده .
> نصب نمیشه باید چکار کرد


حتما باید با administrator  وارد شده باشی

اگر باز هم نشد ، توی منوی start ، accessories،روی command prompt رایت کلیک کنید و گزینه run as administrator رو انتخاب کن بعد توی محیطی که باز میشه سعی کن که سرویس رو نصب کنی

موفق باشی

----------


## ashoori

سرویس با موفقیت نصب میشه ولی هیچ عکس العملی نشون نمیده! نه در xp و نه در 7!!!
مشکل کجاست!؟
همه موارد در پستهای قبلی رعایت شده! ولی همچنان بی نتیجه...
لطفا دوستان این تاپیک را پیگیری بفرمایید.
باتشکر خاص از آقای کشاورز :قلب:

----------


## mahdy.asia

من كه دقيق موارد را انجام دادم اما نه پيغام sucses برام آمد و نه سرويس نصب شد ويندوز هم xp سرويس پك 3
است

----------

