PDA

View Full Version : سوال: حذف يك سرويس



Yasersadegh
یک شنبه 13 اردیبهشت 1388, 15:50 عصر
سلام خدمت دوستان گرامي
من يه برنامه نوشتم كه تويه اون يه سرويس ايجاد مي كنم تا هر بار كه سيستم روشن شد برنامه به طور خودكار اجرا بشه!
اول اين كه اين برنامه رويس رو ايجاد مي كنه و تويه ليست سرويس ها اضافه مي شه ولي سرويسم هر كاري مي كنم Start نمي شه!:افسرده: يعني وقتي استارت مي كنم در حالت starting باقي مي مونه!!:متفکر: سيستم هم كه بالا مياد سرويس به حالت starting ميره!! من چطوري مي تونم اين سرويس رو استارت كنم آيا قلق خاصي داره براي استارت كردن سرويس؟

و همچنين من چطوري مي تونم اين سرويس رو از ليست سرويس ها پاك كنم؟:متفکر:

ممنون ميشم از دوستان كه بنده را در اين زمينه راهنمايي كنند!:بوس:
با تشكر

Yasersadegh
یک شنبه 20 اردیبهشت 1388, 16:22 عصر
از دوستان و اساتيد كسي نبود كه جواب مارو بده!:ناراحت:

Nima_NF
یک شنبه 20 اردیبهشت 1388, 17:05 عصر
در مورد سوال اول که چرا شروع نمی شود و در حالت pending می ماند، نمی توانم نظری بدهم. به هرحال این بستگی به برنامه ای هست که نوشته اید که ممکن هست اشتباهی در ساخت آن کرده باشید.

در مورد حذف کردن سرویس از DeleteService استفاده کنید(قبل از آن نیز باید از OpenSCManager و OpenService استفاده کنید تا سرویس را دریافت کنید):



schService = OpenService( schSCManager, TEXT("MyService_Name"), DELETE);

if (schService == NULL)
{
// failed

}

if (! DeleteService(schService) )
{
// failed
}

CloseServiceHandle(schService);

Yasersadegh
دوشنبه 21 اردیبهشت 1388, 12:12 عصر
استاد گرامي خيلي ممنون از راهنماييتون!:قلب:
در مورد سوال اول هم من كدي كه اول برنامم براي ايجاد سرويس نوشتم رو آوردم خيلي ممنون ميشم اگه در اين مورد هم بنده را راهنمايي كنيد!:لبخندساده:





hSCM=OpenSCManager(0,0,SC_MANAGER_CREATE_SERVICE);
if(hSCM!=NULL)
{
printf("OpenSCManager successfull.");
hService=OpenService(hSCM,TEXT("ProjectTest1"),SC_MANAGER_ALL_ACCESS);
if(hService!=NULL)
{
printf("Open Service successfull.");
}
else
{
hService=CreateService(hSCM,TEXT("ProjectTest1"),TEXT("Tester"),SC_MANAGER_ALL_ACCESS
,SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START,SERV ICE_ERROR_NORMAL,
dwNum,0,0,0,0,0);
if(hService!=NULL){
printf("CreateService successfull.");
}
}
StartService(hService,0,NULL);
CloseServiceHandle(hService);
CloseServiceHandle(hSCM);
}

Yasersadegh
دوشنبه 21 اردیبهشت 1388, 16:17 عصر
اول اين كه اين برنامه سرويس رو ايجاد مي كنه و تويه ليست سرويس ها اضافه مي شه ولي سرويسم هر كاري مي كنم Start نمي شه!:افسرده: يعني وقتي استارت مي كنم در حالت starting باقي مي مونه!!:متفکر: سيستم هم كه بالا مياد سرويس به حالت starting ميره!! من چطوري مي تونم اين سرويس رو استارت كنم آيا قلق خاصي داره براي استارت كردن سرويس؟از دوستان خواهش مي كنم هر كس در مورد اين سوال با توجه به كد پست قبلي اطلاعي داره بنده رو راهنمايي كنه!!:ناراحت:

Nima_NF
دوشنبه 21 اردیبهشت 1388, 18:13 عصر
شما فقط بخش کوچکی از یک سرویس را نوشته اید. سرویس شما یک سرویس نامعتبر هست پس Run نخواهد شد.

یک سرویس باید علاوه بر تابع main اصلی شما یک main دیگر برای اجرای سرویس داشته باشد (تحت عنوان Service Entry Point) که توسط StartServiceCtrlDispatcher به main اصلی برنامه شما متصل خواهد شد.


شما قبل از شروع سرویس و بعد از ساخت سرویس با CreateService باید تابع StartServiceCtrlDispatcher را فراخوانی کنید:



// CreateService .... then:

SERVICE_TABLE_ENTRY DisTable[] =
{
{ TEXT("ProjectTest1"), (LPSERVICE_MAIN_FUNCTION) Service_Main },
{ NULL, NULL }
};

if (!StartServiceCtrlDispatcher( DisTable ))
{
// Show Error
}

در مثال فوق نام تابع سرویس را Service_Main قرار دادم.

پس شما باید یک تابع دیگر به شکل زیر بنویسید و داخل آن مطالب مورد نیاز برای کنترل و شروع سرویس را بنویسید:



void WINAPI Service_Main (DWORD argc, LPTSTR *argv)
{

// use SetServiceStatus(), RegisterServiceCtrlHandler() and etc here

// For example:
// MyServiceStatusHandle = RegisterServiceCtrlHandler(
// "ProjectTest1", ServiceCtrlHandler_Main);

return;
}



برای مثال می توانید از نمونه کدهای لینک های زیر در MSDN استفاده کنید و آن ها را کنار همان تابع main اصلی برنامه کپی کنید. فقط در مثال شما در همه جا باید ProjectTest1 را به جای MyService نام سرویس قرار دهید:

http://msdn.microsoft.com/en-us/library/ms687416(VS.85).aspx (http://msdn.microsoft.com/en-us/library/ms687416%28VS.85%29.aspx)
http://msdn.microsoft.com/en-us/library/ms687414(VS.85).aspx (http://msdn.microsoft.com/en-us/library/ms687414%28VS.85%29.aspx)
http://msdn.microsoft.com/en-us/library/ms687413(VS.85).aspx (http://msdn.microsoft.com/en-us/library/ms687413%28VS.85%29.aspx)

Yasersadegh
دوشنبه 21 اردیبهشت 1388, 18:29 عصر
از شما استاد گرامي نهايت تشكر را به خاطر راهنمايي هاي خوبتان دارم.:قلب:

Yasersadegh
پنج شنبه 24 اردیبهشت 1388, 14:13 عصر
دوست و استاد گرامي



شما قبل از شروع سرویس و بعد از ساخت سرویس با CreateService باید تابع StartServiceCtrlDispatcher را فراخوانی کنید:

کد:
// CreateService .... then:

SERVICE_TABLE_ENTRY DisTable[] =
{
{ TEXT("ProjectTest1"), (LPSERVICE_MAIN_FUNCTION) Service_Main },
{ NULL, NULL }
};

if (!StartServiceCtrlDispatcher( DisTable ))
{
// Show Error
}


تويه اين بخش من كدي كه گفته بود رو نوشتم ولي ارور مربوط به بخش


if (!StartServiceCtrlDispatcher( DisTable ))
{
// Show Error
}
رو نشون ميده و تابع Main سرويس مورد نظر اجرا نميشه.:ناراحت:
ممنون ميشم اگه بنده رو راهنمايي كنيد.:لبخندساده:

Yasersadegh
شنبه 26 اردیبهشت 1388, 12:09 عصر
از دوستان كسي نميدونه چرا اين ارور رو نشون ميده!!؟:متعجب:

Nima_NF
شنبه 26 اردیبهشت 1388, 14:43 عصر
احتمالا چون شما به شکل کنسول برنامه را اجرا می کنید خطای 1063 را دریافت می کنید. باید به قدر کافی به سرویس زمان داده شود تا ابتدا ساخته شود و سپس اجرا شود. (علاوه بر اینکه باید در باز هرمانی زیر 30 ثانیه هم باشد). این کد خودش باید توسط manager اجرا شود

پس هر وقت این خطا را دریافت کردید، خودتان از طریق ارسال پیام net start yourServiceName آن را اجرا کنید.

حال یا مستقیم در cmd یا بعد از مدت زمان مناسب از طریق ارسال با system :



system("net start ProjectTest1");

Yasersadegh
یک شنبه 27 اردیبهشت 1388, 19:08 عصر
ممنون دوست عزيز از راهنماييتون
اروري كه در محيط كنسول ميده دقيقا همين ارور 1063 هست و اروري كه در ويندوز نشون ميده براتون در ضميمه گذاشتم الان توضيحاتتون رو متوجه شدم ولي متوجه نشدم كه الان دقيقا بايد چكار كنم!؟:متفکر: يه كارايي هم كردم ولي همچنان اين ارور رو نشون ميده!!
اگه ممكنه بيشتر راهنمايي كنيد.:لبخندساده: