نمایش نتایج 1 تا 24 از 24

نام تاپیک: بحث، گفتگو، آموزش پیرامون برنامه نویسی سرویس ویندوزهای ان.تی

  1. #1
    کاربر دائمی آواتار Mr'Jamshidy
    تاریخ عضویت
    مرداد 1386
    محل زندگی
    Network
    پست
    994

    بحث، گفتگو، آموزش پیرامون برنامه نویسی سرویس ویندوزهای ان.تی

    سلام

    این تاپیک ایجاد شده تا در مورد روش های ساخت سرویس های ویندوز بوسیله ویژوال بیسیک گفتگو و تبادل اطلاعات بشه.


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



    ابتدا باید ببینیم که چرا نیاز داریم تا یک سرویس بنویسیم، هدف از نوشتن سرویس چیه؟

    یکی از مواردی که ما از سرویس ها استفاده میکنیم دسترسی به سطح سیستم هست
    مثلا آنتی ویروس ها در این سطح اجرا میشن و اجازه بستن سرویس رو از شما میگیرن

    دقت کن سرویس باز حالا هی بیا سوال کن چطور جلو بسته شدن پروسه رو بگیرم

    Untitled.jpg

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

    البته به غیر از بعضی هاش که باید براش درایور نوشته بشه بگذریم

    خوب حالا کار به این حرفا نداریم میریم سر بحث نحوه ساخت

    نوشتن سرویس ها در ویژوال بیسیک 6 راه های متعددی داره که من فعلا به 2 راه اشاره میکنم

    روش اول (استفاده از کامپوننت مایکروسافت):

    فایل مربوطه: NTSVC.zip

    خوب همونطور که از اسمش پیداست مشخصه برای این روش نیاز به یک کامپوننت داریم

    اسم کامپوننت هست NTSVC و توسط شرکت مایکروسافت ارایه شده (که از قسمت ضمیمه ها قابل دسترس هست)

    با استفاده از این کامپوننت شما میتونید سرویس مورد نظر تون رو بنویسید اما چطور؟

    1. ویژوال بیسیک رو باز کنید
    2. یک پروژه از نوع Standard EXE ایجاد کنید
    3. کامپوننت مورد نظر رو به پروژه اضافه کنید (Microsoft NT Service Control)
    4. کامپوننت رو روی فرم قرار داده و به صورت زیر تنظیم میکنیم

    Name
    cNTService
    -------
    DisplayName
    نامی که دوست دارید در پانل کنترل سرویس ها نمایش داده بشه
    -------
    Interactive
    اگر میخواهید تا سرویس توانایی ارتباط با کامپیوتر رو داشته باشه این گزینه رو True کنید
    -------
    ServiceName
    نام سرویس شما (بدون کاراکتر فاصله)
    -------
    StartMode
    این گزینه مشخص میکنه که سرویس شما به چه نحوی میتونه شروع به کار کنه
    - svcStartAutomatic: این گزینه مشخص میکنه که سرویس بصورت خودکار اجرا بشه
    - svcStartManual: این گزینه مشخص میکنه که سرویس بصورت دستی اجرا بشه
    - svcStartDisabled: این یکی هم میگه که اصلا اجرا نشه


    5. کد زیر رو به رویداد Form_Load اضافه کنید
        Select Case UCase$(Trim$(Command$))
    Case "-I", "/I"
    If cNTService.Install Then
    MsgBox cNTService.DisplayName & " installed successfully."
    Else
    MsgBox cNTService.DisplayName & " did not install successfully."
    End If
    Case "-U", "/U"
    If cNTService.Uninstall Then
    MsgBox cNTService.DisplayName & " uninstalled successfully."
    Else
    MsgBox cNTService.DisplayName & " did not uninstall successfully."
    End If
    Case ""
    cNTService.StartService
    Case Else
    MsgBox "The parameter: " & Command & " was not understood. Try -I (install) or -U (uninstall)."
    End Select


    مدیریت خطاها:

    در روال مدیریت خطا ممکنه شما بخواید از اطلاعات خطا خروجی بگیرید یا همون لاگ
    در این حالت شما میتونید از App.LogEvent استفاده کنید ولی در NTsvc ما گزینه دیگری نیز داریم
    شما میتوانید از گزینه cNTService.LogEvent هم استفاده کنید

    NTService.LogEvent svcEventError, svcMessageError, Err.Description

    و
    NTService.LogEvent svcEventInformation, svcMessageInfo, "Something happened"


    رویدادهای سرویس:

    شما نیاز دارید در برخی از رویداد های زیر کد بنویسید

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

    در این حالت اگر کد های شما با موفقیت کار خود را انجام داد Flag یا همون پرچم Success رو برابر True قرار دهید

    رویداد Stop:
    این رویداد زمانی اجرا میشود که سرویس شما درحال پایان یافتن باشد

    رویداد Pause:
    این رویداد زمانی اجرا میشود که سرویس شما درحال متوقف شدن باشد

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

    مشکلات بالقوه:
    چند مشکل در هنگام اجرا یک سرویس ان.تی در ویژوال بیسیک 6 به صورت بالقوه وجود دارد که به برخی از آنها اشاره میشود

    وابستگیها:
    اگر سرویس شما به سرویس دیگری وابسته است، شما باید مطمئن شوید این اطلاعات به درستی در رجیستری ثبت شده است

    هشدار: تنظیم نادرست وابستگی به یک سرویس در رجیستری میتواند سیستم عامل شما را غیر قابل بوت کند، با توجه به مسایلی مانند وابستگی مدور (سرویس الف نمیتواند قبل از سرویس ب و سرویس ب نمیتواند قبل از سرویس الف شروع به کار کند) در نتیجه هیچ یک از سرویس ها شروع به کار نخواهند کرد.

    خیلی مراقب باشید، خطر داره حسن!


    خوب دیگه دهنم سرویس شد بسکه نوشتم باقی توضیحات و روش دوم باشه برای بعد
    موفق باشید


    **ویرایش


    روش دوم (استفاده از برنامه واسطه):

    فایل مربوطه: Windows Service.zip

    این روش خیلی آسون تر هست

    در واقع تو این روش شما طبق روال همیشه برنامه تون رو مینویسید و کار خاصی هم انجام نمیدید
    اما موقع افزودن برنامه به سرویس ها یک واسطه قرار میدید

    خوب فایل مربوطه رو دانلود کنید

    داخل فایل فشرده 4 عدد فایل دیگه هست که 3 تا از اونا فایل اجرایی هستن

    اگر برای تست هست که زیاد مهم نیست اما در مواقعی که میخواید سرویس رو واقعا رو سیستم کاربر نصب کنید حتما تو پوشه System32 کپی کنید (البته تو یک پوشه جدا کنه)

    خوب حالا از برنامه های ارسال شده برنامه SRVINSTW.EXE رو اجرا کنید

    این برنامه کار نصب و حذف سرویس رو انجام میده که بعده ها خودتون باید این کار رو دستی انجام بدید، این فقط برای اینه که با روال کار آشنا بشید

    در صفحه اول از شما میپرسه چه کاری میخواید انجام بدید (نصب سرویس یا حذف)
    گزینه Install Service رو انتخاب کنید و Next رو کلیک کنید (شماره 1)

    در صفحه دوم میپرسه که سرویس کجا قرار داره روی همین سیستم یا یک سیستم دیگه در شبکه؟ (شماره 2)

    اینجا لازمه که یک نکته رو بگم:
    سعی کنید تا جایی که ممکنه سرویس ها رو از روی شبکه نصب نکنید چون این کار ممکنه که به سیستم عامل شما اسیب وارد کنه

    خوب با توجه به نکته بالا گزینه Local Machin رو انتخاب کرده و گزینه Next رو کلیک کنید

    در این صفحه از شما نام سرویس جدید رو میخواد یک نام انتخابی وارد کنید (شماره 3)

    و سپس گزینه Next رو کلیک کنید

    حالا اینجا آدرس سرویس رو ازتون میپرسه (شماره 4)

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

    خوب در اینجا آدرس فایل SRVANY.EXE رو وارد کرده و گزینه Next رو کلیک کنید
    فایل SRVANY.EXE همراه با ضمیمه ارسال شده

    در این صفحه نوع سرویس رو باید انتخاب کنید که ما گزینه (شماره 5)

    که ما گزینه Service is its own process رو انتخاب میکنید و گزینه Next رو کلیک میکنید

    از اون دو مورد دیگه استفاده نکنید
    من خودم هم هنوز نمیدونم به چه دردی میخورن ولی فهمیدم بهتون میگم


    حالا در این صفحه شما باید به برنامه بگید که میخواید سرویستون در چه سطح دسترسی قرار داشته باشه (شماره 6)

    منظور از سطح دسترسی همون مجوزی هست که به نام کاربری داده میشه یعنی این که شما باید مشخص کنید تحت کدوم نام کاربری میخواید سرویس رو اجرا کنید (فکر کنم اینطوری بهتر بود)

    خوب ما 2 تا گزینه داریم System Account و Other Account فکر نمیکنم این دو مورد نیازی به توضیح داشته باشه!

    در زیر گزینه System Account ما یک گزینه داریم Allow Service to Interact with Desktop که اگر میخواهید تا سرویس توانایی ارتباط با کامپیوتر رو داشته باشه این گزینه رو تیک بزنید
    همچنین در زیر گزینه Other Account ما دو گزینه داریم با نام های Account و Password که زمانی که بخواهیم از نام کاربری غیر از نام کاربری System استفاده کنید باید نام کاربری و کلمه عبورش رو اینجا وارد کنیم

    البته برای تنظیم Other Account دقت کنید چون مثلا نام کاربری من الان هست A و کلمه عبورش هم هست B خوب چه تضمینی وجود داره روی همه سیستم ها این نام کاربری یکی باشه برای همین یا از نام کاربری های پیشفرض سیستم استفاده کنید (که این گزینه پیشنهاد نمیشه خون کاربری مثل من همیشه نام های کاربری پیشفرض رو حذف میکنه مثل Administrator) یا مثل برخی سرویس ها خودتون نام کاربری بسازید و از دید کاربران عادی مخفیش کنید مثل عکس (این روش کاملا پیشنهاد میشه) (شماره 7)

    خوب اینجا گزینه System Account رو انتخاب کنید و گزینه Allow Service to Interact with Desktop رو علامت دار کنید و Next رو کلیک کنید

    در این صفحه به نوع اجرا شدن سرویس اشاره میکنه که شامل 5 قسمت هست (شماره 8)
    1. Automatic
    2. Manual
    3. Disabled
    4. Boot
    5. System

    گزینه 4 و 5 غیر فعال هستن چون برای سرویس ها کار نمیکنن و فقط برای درایور ها کار میکنن همون گزینه های غیر قابل استفاده در شماره 5

    و 3 تا گزینه اول هم عبارتند از
    1. Automatic به صورت خودکار اجرا میشه
    2. Manual به صورت دستی باید اجراش کنید
    3. Disabled اجرا نمیشه

    خوب گزینه Automatic رو علامت دار کنید و Next رو کلیک کنید

    و در آخر گزینه Finish رو کلیک کنید

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

    خوب حالا ما یک سرویس به سیستم عامل معرفی کردیم ولی برنامه خودمون که اجرا نمیشه هنوز

    برنامه Registry Editor ویندوز رو اجرا کنید (همه بلدن ها ولی برای کسایی که شاید بلد نباشن مثل من در ران ویندوز بنویسید Regedit و OK کنید)

    و به مسیر HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\servic es\YourService بروید
    به جای کلمه YourService همون نامی که برای سرویستون انتخاب کرده بودید وارد کنید مثلا من کلمه Sample رو برای سرویسم انتخاب کرده بودم (شماره 9)

    خوب حالا یک کلید زیر کلید سرویستون ایجاد کنید و نام اون رو بزارید Parameters

    در زیر کلید Parameters یک مقدار جدید از نوع String Value ایجاد کنید و نام اون رو برابر Application قرار بدید و مقدار Application رو برابر آدرس دقیق و کامل فایل اجرایی خودتون که با ویژوال بیسیک نوشتید کنید

    تموم شد!

    حالا اونایی که ویندوز 7 دارن Task Manager رو اجرا کنن و از تب سرویس دنبال نام سرویس خودشون بگردن (شماره 10)

    وقتی پیداش کردید انتخابش کنید و راست کلیک و Start Service رو انتخاب کنید

    اگر برنامه تون فرم داشته باشه مثل یکی من ویندوز بهتون میگه که این سرویس میخواد یک پیغام به شما نشون بده که نیاز به تایید شما داره بهش اجازه نمایش پیغام رو میدید (شماره 11)
    گزینه View The Message رو کلیک کنید فرم برنامه تون رو میبینید (البته یک جای دیگه)

    وقتی خوب فرمتون رو دیدید و کلی عشق کردید بعد گزینه Return Now رو کلیک کنید تا به محیط ویندوزتون برگردید از اینجا نمیشد عکس گرفت

    ولی حواستون باشه تو سرویس اصل کاریتون فرم نسازید ها آبروتون میره

    اونایی که ویندوز 7 ندارن برن تو ران بنویسن Services.msc و OK کنن
    در صفحه باز شده دنبال نام سرویس مورد نظر بگردن
    وقتی پیدا شد روش دابل کلیک کنن
    و استارت رو بزنن

    تموم شد



    **ویرایش

    سورس Service Manager که توسط دوست خوبمون آقای AbbasVB نوشته شده به ضمیمه ها اضافه شد
    توضیحات نویسنده سورس
    نقل قول نوشته شده توسط AbbasVB مشاهده تاپیک
    آیا تا حالا می خواستید بدونید چه سرویس های روی ویندوز نصب شده؟
    آیا تا حالا خواسته اید بدانید چه سرویس هایی در حال اجرا هستند چه سرویس هایی خاموش هستند می باشند؟
    آیا تا حالا خواسته اید یک سرویس نصب کنید؟
    آیا تا حالا خواسته اید کاری کنید که یک سرویس دیگر اجرا نشود؟
    آیا تا حالا خواسته اید یک سرویس را پاک کنید؟
    آیا تا حالا خواسته اید کلا خواسته اید یک سرویس را دست کاری کنید؟
    و آیا تا حالا خواسته اید همه این کار ها رو با برنامه ی خودتون انجام بدهید؟
    فایل های ضمیمه فایل های ضمیمه
    آخرین ویرایش به وسیله Mr'Jamshidy : سه شنبه 03 بهمن 1391 در 14:07 عصر

  2. #2

    نقل قول: بحث، گفتگو، آموزش پیرامون برنامه نویسی سرویس ویندوزهای ان.تی

    درود
    من هم دنبال این بحث رو گرفتم و به نتایج خوبی رسیدم قبلا هم یه پست در این باره دادم ولی کسی توجه نکرد بگذریم
    این کد هایی که شما نوشتید یک سرویس رو نصب می کنه که برنامه ای که به سیستم به عنوان سرویس معرفی می شه باید قابلیت اجرا در محیط سرویس رو داشته باشه اگر از برنامه ی معمولی برای این که در محیط سرویس استفاده بشه دوام نمیاره و بسته می شه
    در ضمن بگم که در محیط سرویس برنامه قادر به برقرار ارتباط گرافیکی با کاربر نیست و خیلی بتواند یک پیغام نشان بدهد

  3. #3

    Thumbs down نقل قول: بحث، گفتگو، آموزش پیرامون برنامه نویسی سرویس ویندوزهای ان.تی

    آیا تا حالا می خواستید بدونید چه سرویس های روی ویندوز نصب شده؟
    آیا تا حالا خواسته اید بدانید چه سرویس هایی در حال اجرا هستند چه سرویس هایی خاموش هستند می باشند؟
    آیا تا حالا خواسته اید یک سرویس نصب کنید؟
    آیا تا حالا خواسته اید کاری کنید که یک سرویس دیگر اجرا نشود؟
    آیا تا حالا خواسته اید یک سرویس را پاک کنید؟
    آیا تا حالا خواسته اید کلا خواسته اید یک سرویس را دست کاری کنید؟
    و آیا تا حالا خواسته اید همه این کار ها رو با برنامه ی خودتون انجام بدهید؟
    خوب معلومه که نمی دونستید و نمی تونستید!
    خوب این سورس رو که خودم کاملش کردم رو ببینید

    دهنم سرویس شد
    همین اتفاق برای من افتاد تا این برنامه رو کامل کردم


    نمی دونم چرا نمی شه فایل رو روی سرور سایت آپلود کنم کسی می دونه چرا؟
    فایل رو این جا آپلود کردم

    http://s2.picofile.com/file/76290401...ce_Manager.rar

  4. #4
    کاربر دائمی آواتار Mr'Jamshidy
    تاریخ عضویت
    مرداد 1386
    محل زندگی
    Network
    پست
    994

    نقل قول: بحث، گفتگو، آموزش پیرامون برنامه نویسی سرویس ویندوزهای ان.تی

    نقل قول نوشته شده توسط AbbasVB مشاهده تاپیک
    درود
    من هم دنبال این بحث رو گرفتم و به نتایج خوبی رسیدم قبلا هم یه پست در این باره دادم ولی کسی توجه نکرد بگذریم
    این کد هایی که شما نوشتید یک سرویس رو نصب می کنه که برنامه ای که به سیستم به عنوان سرویس معرفی می شه باید قابلیت اجرا در محیط سرویس رو داشته باشه اگر از برنامه ی معمولی برای این که در محیط سرویس استفاده بشه دوام نمیاره و بسته می شه
    در ضمن بگم که در محیط سرویس برنامه قادر به برقرار ارتباط گرافیکی با کاربر نیست و خیلی بتواند یک پیغام نشان بدهد
    من خودم از روش دوم که اسنفاده کردم هیچ مشکلی پیش نیومد همون که هنوز نگفتمش ولی میگم به زودی

    در واقع سرویس ها همون برنامه های اجرایی معمولی هستن با این تفاوت که سیستم عامل پیغام های کمی متفاوت تر به برنامه ارسال میکنه که ویژوال بیسیک در حالت معمول قادر به پردازش این پیغام ها نیست

    این کامپوننتی که من گزاشتم (همون که ماله مایکروسافته) در واقع تنها کاری که میکنه این پیغام ها رو پردازش میکنه وگرنه ثبت سرویس با اضافه کردن چند مورد به رجیستری امکان پذیره

    نقل قول نوشته شده توسط AbbasVB مشاهده تاپیک
    آیا تا حالا می خواستید بدونید چه سرویس های روی ویندوز نصب شده؟
    آیا تا حالا خواسته اید بدانید چه سرویس هایی در حال اجرا هستند چه سرویس هایی خاموش هستند می باشند؟
    آیا تا حالا خواسته اید یک سرویس نصب کنید؟
    آیا تا حالا خواسته اید کاری کنید که یک سرویس دیگر اجرا نشود؟
    آیا تا حالا خواسته اید یک سرویس را پاک کنید؟
    آیا تا حالا خواسته اید کلا خواسته اید یک سرویس را دست کاری کنید؟
    و آیا تا حالا خواسته اید همه این کار ها رو با برنامه ی خودتون انجام بدهید؟
    خوب معلومه که نمی دونستید و نمی تونستید!
    خوب این سورس رو که خودم کاملش کردم رو ببینید

    همین اتفاق برای من افتاد تا این برنامه رو کامل کردم


    نمی دونم چرا نمی شه فایل رو روی سرور سایت آپلود کنم کسی می دونه چرا؟
    فایل رو این جا آپلود کردم

    http://s2.picofile.com/file/76290401...ce_Manager.rar
    جالب بود ممنون
    آقا با اجازه شما این سورس رو من به پست اول اضافه کردم

  5. #5

    نقل قول: بحث، گفتگو، آموزش پیرامون برنامه نویسی سرویس ویندوزهای ان.تی

    اینم یه سورس که بدون هیچ مشکلی در محیط سرویس اجرا میشه
    فقط کافیه با برنامه ای که اولی پست کردم (توی پست 1هستش) اون رو نصب کنید
    یه فایل می سازه توی درایو C و توش متن چاپ می کنه

    http://s1.picofile.com/file/7629085050/Service.rar.html

  6. #6
    کاربر دائمی
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    MsgBox barnamenevis.org
    پست
    540

    نقل قول: بحث، گفتگو، آموزش پیرامون برنامه نویسی سرویس ویندوزهای ان.تی

    نقل قول نوشته شده توسط AbbasVB مشاهده تاپیک
    اینم یه سورس که بدون هیچ مشکلی در محیط سرویس اجرا میشه
    فقط کافیه با برنامه ای که اولی پست کردم (توی پست 1هستش) اون رو نصب کنید
    یه فایل می سازه توی درایو C و توش متن چاپ می کنه

    http://s1.picofile.com/file/7629085050/Service.rar.html
    + منبع:

    NT Service in VB6 Without NTSvc ocx


    + یه تجربه داشتم گفتم به شما هم بگه:

    این سورس آپدیت شده هست... ورژن قبلیش هم کمی تفاوت داشت با این، خیلی cpu رو درگیر میکرد، به همین خاطر بود که به ذهنم رسید به جای حلقه do loop که باعث درگیر شدن زیاد cpu میشه از یه form استفاده کنم... هر چند که نمایش داده نمیشه ولی باعث میشه پروسس پس از اتمام کار SubMain بسته نشه...

    خواستم دوباره کد ها رو از نو باز نویسی کنم
    ولی به مشکلاتی برخودم که شاید اگر تجربه نکرده باشید بگید این چه چرندیاتیه که دارم میگم...



    همونطور که میدونید اصل قضیه اجرا شدن سرویس مربوط به تابع API زیر هست
    StartServiceCtrlDispatcher

    برای اجرای سرویس، سیستم فایل exe شما رو اجرا میکنه... بعدش چندین ثانیه بهتون مهلت میده تا تابع بالا رو فراخوانی کنید... اگر نکنید پروسه شما رو میبنده...

    این همون اتفاقیه که مستر گفتن:

    در واقع سرویس ها همون برنامه های اجرایی معمولی هستن با این تفاوت که سیستم عامل پیغام های کمی متفاوت تر به برنامه ارسال میکنه که ویژوال بیسیک در حالت معمول قادر به پردازش این پیغام ها نیست

    توی سورس میاد به جای declare کردن معمولی توابع اونا رو توی فایل lib میریزه؛ من با خودم گفتم چه کاریه بیام فایل lib رو حذف کنم خودم دستی توابع استفاده شده رو declare کنم؛ هرچند به نظر میرسید نباید مشکلی برای برنامه پیش بیاد (چون تفاوتی بین declare کردن معمولی و استفاده از lib وجود نداره) ولی دیدم که مشکل دقیقا از همین هست؛
    دقیق تر بگم مشکل از ساخت thread جداگانه برای سرویس هست، و thread جدید با declare کردن معمولی مشکل داره؛ خوب گفتم از
    CreateThread استفاده نکنم و فقط تابع StartServiceCtrlDispatcher رو مستقیم فراخوانی کنم؛ اما باز هم نشد.
    تو سرویس های دیگه هم دیدم که حداقل از 2 thread استفاده میکنن؛ خلاصه که سخت به مشکل بر خوردم...
    اگر راه حلی برای این دارید ممنون میشم....
    آخرین ویرایش به وسیله meys34 : سه شنبه 03 بهمن 1391 در 11:16 صبح دلیل: اضافه شدن تجربیاتم...

  7. #7
    کاربر دائمی آواتار Mr'Jamshidy
    تاریخ عضویت
    مرداد 1386
    محل زندگی
    Network
    پست
    994

    نقل قول: بحث، گفتگو، آموزش پیرامون برنامه نویسی سرویس ویندوزهای ان.تی

    نقل قول نوشته شده توسط meys34 مشاهده تاپیک
    + منبع:

    NT Service in VB6 Without NTSvc ocx


    + یه تجربه داشتم گفتم به شما هم بگه:

    این سورس آپدیت شده هست... ورژن قبلیش هم کمی تفاوت داشت با این، خیلی cpu رو درگیر میکرد، به همین خاطر بود که به ذهنم رسید به جای حلقه do loop که باعث درگیر شدن زیاد cpu میشه از یه form استفاده کنم... هر چند که نمایش داده نمیشه ولی باعث میشه پروسس پس از اتمام کار SubMain بسته نشه...

    خواستم دوباره کد ها رو از نو باز نویسی کنم
    ولی به مشکلاتی برخودم که شاید اگر تجربه نکرده باشید بگید این چه چرندیاتیه که دارم میگم...



    همونطور که میدونید اصل قضیه اجرا شدن سرویس مربوط به تابع API زیر هست
    StartServiceCtrlDispatcher

    برای اجرای سرویس، سیستم فایل exe شما رو اجرا میکنه... بعدش چندین ثانیه بهتون مهلت میده تا تابع بالا رو فراخوانی کنید... اگر نکنید پروسه شما رو میبنده...

    این همون اتفاقیه که مستر گفتن:




    توی سورس میاد به جای declare کردن معمولی توابع اونا رو توی فایل lib میریزه؛ من با خودم گفتم چه کاریه بیام فایل lib رو حذف کنم خودم دستی توابع استفاده شده رو declare کنم؛ هرچند به نظر میرسید نباید مشکلی برای برنامه پیش بیاد (چون تفاوتی بین declare کردن معمولی و استفاده از lib وجود نداره) ولی دیدم که مشکل دقیقا از همین هست؛
    دقیق تر بگم مشکل از ساخت thread جداگانه برای سرویس هست، و thread جدید با declare کردن معمولی مشکل داره؛ خوب گفتم از
    CreateThread استفاده نکنم و فقط تابع StartServiceCtrlDispatcher رو مستقیم فراخوانی کنم؛ اما باز هم نشد.
    تو سرویس های دیگه هم دیدم که حداقل از 2 thread استفاده میکنن؛ خلاصه که سخت به مشکل بر خوردم...
    اگر راه حلی برای این دارید ممنون میشم....
    همونطور که خودت گفتی دوست عزیز باید از Multi Threading استفاده کنی
    ولی خوب همونطور که همه میدونن Multi Threading تو ویژوال بیسیک 6 پشتیبانی نمیشه

    حالا من دارم روش کار میکنم تا بدون درد سر از خاصیت Multi Threading در ویژوال بیسیک استفاده کرد

    در ضمن خیلی حال کردم
    مثل این که داره تاپیک جذاب میشه

  8. #8
    کاربر دائمی
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    MsgBox barnamenevis.org
    پست
    540

    نقل قول: بحث، گفتگو، آموزش پیرامون برنامه نویسی سرویس ویندوزهای ان.تی

    نقل قول نوشته شده توسط Mr'Jamshidy مشاهده تاپیک
    همونطور که خودت گفتی دوست عزیز باید از Multi Threading استفاده کنی
    ولی خوب همونطور که همه میدونن Multi Threading تو ویژوال بیسیک 6 پشتیبانی نمیشه

    حالا من دارم روش کار میکنم تا بدون درد سر از خاصیت Multi Threading در ویژوال بیسیک استفاده کرد

    در ضمن خیلی حال کردم
    مثل این که داره تاپیک جذاب میشه
    پشتیبانی میکنه یا نه مهم نیست... سورسی که AbbasVB گذاشته رو ببینید... به درستی کار میکنه و اتفاقا از هیچ ocx یا برنامه واسطی هم استفاده نکرده ...
    فقط و فقط از Multi Threading استفاده کرده و به درستی هم کار میکنه...

    من گفتم می خواستم از شر حلقه do loop خلاص شم، دوباره کد ها رو بازنویسی کردم دیدم با اینکه همه کار هارو به درستی انجام میدم ولی مشکل داره و نمیشه...

    ولی هنوز وقت نکردم درستو حسابی روش کار کنم ببینم درست میشه یا نه...

  9. #9

    نقل قول: بحث، گفتگو، آموزش پیرامون برنامه نویسی سرویس ویندوزهای ان.تی

    سلام

    در رابطه با مالتی تردینگ خیلی اطلاعات ندارم خوبه یه خورده هم در این رابطه توضیح بدید

    حالا که تاپیک داره داغ می شه چند تا سوال:
    اول آیا میشه وقتی سرویس داره خاموش می شه خود سرویس بفهمه و از کاربر اجازه بگیره یا یک برنامه دیگه منتظر باشه هر موقع به سرویس پیغام ارسال شد ابتدا برنامه ای که در حالت عادی هست بفهمه و در صورت تایید کاربر سرویس رو ببنده؟
    دوم چه طور بین یک سرویس و برنامه رابطه بر قرار کنیم مثل آنتی ویروس ها یک سرویس و یک رابط گرافیکی؟
    سوم چطور یک برنامه رو توسط سرویس در محیط عادی اجرا کنیم؟(چون سرویس هر برنامه ای رو که اجرا می کنه در همون محیط سرویسه اجا می شه و بسته می شه)

    دوستان نیستید!

    چرا توی بحث شرکت نمی کنید تا استفاده کنیم؟

  10. #10
    کاربر دائمی آواتار Mr'Jamshidy
    تاریخ عضویت
    مرداد 1386
    محل زندگی
    Network
    پست
    994

    نقل قول: بحث، گفتگو، آموزش پیرامون برنامه نویسی سرویس ویندوزهای ان.تی

    ای بابا ما گفتیم یکی جواب میده حتما

    در مورد مالتب تردینگ این کتاب رو دانلود کن کامل بهت یاد میده

    در مورد
    اول آیا میشه وقتی سرویس داره خاموش می شه
    هنوز چیزی نمیدونم اما بلاخره میفهمم

    در مورد
    دوم چه طور بین یک سرویس و برنامه رابطه بر قرار کنیم
    به نظر من از 3 حالت خارج نیست
    حالت اول DDE
    حالت دوم Send Message
    حالت سوم TCP/IP -- UDP

    در مورد این احتمالا همین 2 حالت باید باشه

    حالت اول: یک تابع مثل ShellExecute باید باشه که میتونی بهش بگی من میخوام تحت این نام کاربری برام برنامه رو اجرا کنی
    حالت دوم: با استفاده از رابط این کارو میکنه همون برنامه ای که تو یوزر مورد نظر اجرا هست و با هم ارتباط دارن

    حالا بلاخره من اینارو میفهمم عجله نکن قدم به قدم با هم پیش میریم

  11. #11

    نقل قول: بحث، گفتگو، آموزش پیرامون برنامه نویسی سرویس ویندوزهای ان.تی

    Mr'Jamshidy دمت گرم
    ممنون از رحمتی ک میشی
    فقط کاشکی این عکس ها رو بزرگ تر میگرفتی چشممون در امد

    نقل قول نوشته شده توسط Mr'Jamshidy مشاهده تاپیک
    در مورد مالتب تردینگ این کتاب رو دانلود کن کامل بهت یاد میده
    کدوم کتاب؟؟؟؟!!!!!!!نه لینکی نه اسمی
    ممنون اگه بذاریش عالی میشه
    موفق باشید

  12. #12
    کاربر دائمی آواتار Mr'Jamshidy
    تاریخ عضویت
    مرداد 1386
    محل زندگی
    Network
    پست
    994

    نقل قول: بحث، گفتگو، آموزش پیرامون برنامه نویسی سرویس ویندوزهای ان.تی

    نقل قول نوشته شده توسط Hashemvp مشاهده تاپیک
    Mr'Jamshidy دمت گرم
    ممنون از رحمتی ک میشی
    فقط کاشکی این عکس ها رو بزرگ تر میگرفتی چشممون در امد

    کدوم کتاب؟؟؟؟!!!!!!!نه لینکی نه اسمی
    ممنون اگه بذاریش عالی میشه
    موفق باشید
    ای بابا شرمنده اصلا حواسم نبود

    اون عکس ها رو هم واسه این کوچیک گرفتم چون بتونم راحت تو سایت بزارم
    اگر با دیدنش مشکل داری:

    اگر مرورگردت فایر فاکسه کنترل رو بگی اسکرول رو بچرخون
    اگر اینترنت اکسپلورر هست پایین سمت راست یک جا نوشته 100% زیادش کن

    بقیه رو هم نمیدونم
    فایل های ضمیمه فایل های ضمیمه

  13. #13

    نقل قول: بحث، گفتگو، آموزش پیرامون برنامه نویسی سرویس ویندوزهای ان.تی

    نقل قول نوشته شده توسط Mr'Jamshidy مشاهده تاپیک
    اگر مرورگردت فایر فاکسه کنترل رو بگی اسکرول رو بچرخون
    اگر اینترنت اکسپلورر هست پایین سمت راست یک جا نوشته 100% زیادش کن
    بقیه رو هم نمیدونم

    ممنون
    مشگل اینکه خیلی تار میشه حالا
    حالا این عکس ها زیاد مهم نبود ولی توی عکس های بعدی کیفیتش بالا تر باشه بهتر میشه(ممنونت میشم)

  14. #14

    نقل قول: بحث، گفتگو، آموزش پیرامون برنامه نویسی سرویس ویندوزهای ان.تی

    درود
    ممنون آقای جمشیدی


    در مورد dde نمی دونم حدث می زنم که مخفف Dynamic Data Exchang باشه دوتا برنامه به یک قسمت از رم دسترسی مشترک دارند و اطلاعات رو تبادل می کنند (آیا درسته؟)

    و اما Send Messageدر این باره اطلاعاتی ندارم

    TCP/IP -- UDP یه بار امتحان کردم جواب نداد شاید من راه رو اشتباه رفته بودم

    در مورد ShellExecute میشه یک مثال بزنید


    حالا بلاخره من اینارو میفهمم عجله نکن قدم به قدم با هم پیش میریم
    شرمنده یه مقدار هیجان زده شدم

  15. #15
    کاربر دائمی آواتار Mr'Jamshidy
    تاریخ عضویت
    مرداد 1386
    محل زندگی
    Network
    پست
    994

    نقل قول: بحث، گفتگو، آموزش پیرامون برنامه نویسی سرویس ویندوزهای ان.تی

    نقل قول نوشته شده توسط AbbasVB مشاهده تاپیک
    درود
    ممنون آقای جمشیدی


    در مورد dde نمی دونم حدث می زنم که مخفف Dynamic Data Exchang باشه دوتا برنامه به یک قسمت از رم دسترسی مشترک دارند و اطلاعات رو تبادل می کنند (آیا درسته؟)

    و اما Send Messageدر این باره اطلاعاتی ندارم

    TCP/IP -- UDP یه بار امتحان کردم جواب نداد شاید من راه رو اشتباه رفته بودم

    در مورد ShellExecute میشه یک مثال بزنید


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

    قابلیت SendMessage هم به مثال زیر توجه کن

       Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Private Declare Sub ReleaseCapture Lib "User32" ()
    Const WM_NCLBUTTONDOWN = &HA1
    Const HTCAPTION = 2
    Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    'KPD-Team 1999
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    Dim lngReturnValue As Long
    If Button = 1 Then
    'Release capture
    Call ReleaseCapture
    'Send a 'left mouse button down on caption'-message to our form
    lngReturnValue = SendMessage(Me.hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
    End If
    End Sub
    Private Sub Form_Paint()
    Me.Print "Click on the form, hold the mouse button and drag it"
    End Sub


    این مثال باعث میشه شما هر جای فرم موس رو پایین نگه داری فرم جا به جا بشه حالا چطور؟
    اومده با تابه SendMessage به سیستم عامل کلک رشتی زده و بهش پیغام داده که ما نوار عنوان فرم رو گرفتیم
    خوب تا این جا که کار SendMessage مشخص شد حالا میایم فرم رو SubClass میکنیم و پیغام های ارسالی رو مورد پردازش قرار میدیم
    بعد با تابع SendMessage پیغام خودمون رو به اون هندل ارسال میکنیم
    تو پردازش ها هم که اگر به پیغام های مورد نظر رسیدیم که بهشون عکس العمل نشون میدیم

    TCP و UDP هم تا جایی که من میدونم باید جواب بده چون شبکه هیچ ربطی به نام کاربری و ... نداره

    حالت اول: یک تابع مثل ShellExecute باید باشه که میتونی بهش بگی من میخوام تحت این نام کاربری برام برنامه رو اجرا کنی
    ببین دوست من گفتم که باید باشه یعنی هنوز پیگیر این موضوع نشدم
    بزار اول موضوع ارتباط رو سرو سامون بدم بعد یکی یکی میریم جلو

  16. #16

    Unhappy فوق مبتدی !

    سلام دوستان
    سه تا سوال داشتم اگه امکان داره یکم در این باره توضیح بدید !
    1-سرویس ویندوز چیست ؟
    2-سرویس ویندوز چه کارایی داره ؟
    3- به چه درد برنامه نویس میخوره ؟
    باتشکر از حسن توجه دوستان گل
    آخرین ویرایش به وسیله سپهر-111 : چهارشنبه 04 بهمن 1391 در 16:47 عصر

  17. #17

    نقل قول: بحث، گفتگو، آموزش پیرامون برنامه نویسی سرویس ویندوزهای ان.تی

    درود
    آقای جمشیدی خیلی خوب توضیح دادند
    ولی باز می گم

    سرویس ویندوز چیست ؟
    همان برنامه های معمولی هستند که در یک محیط جدا اجرا می شوند سرویس ها برنامه هایی هستند کاربر نیازی ندارد با آن ها رابطه بر قرار کند می تواند خود کار اجرا شود و کاربر(معمولی) هم نتواند جلوی آن را بگیرد سرویس ها وظایف مهمی بر عهدا دارند مثل مدیریت ارتباطات شبکه و امنیت آن , صدای ویندوز,برخی موارد کار با سخت افزار و ...

    -
    به چه درد برنامه نویس میخوره ؟
    خوب به خیلی از کار ها میاد به عنوان مثال برای همین آنتی ویروس نویسی نوشتن بعضی از برنامه های تحت شبکه , ویروس نویسی و هر برنامه ای که لازم باشه همیشه در حال اجرا باشه
    سرویس ها در برخی موارد دارای سطح دسترسی بیشتری نسبت به برنامه های معمولی هستند


    هر کجاش اشتباه بود دوستان اصلاح کنند

  18. #18
    کاربر دائمی
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    MsgBox barnamenevis.org
    پست
    540

    نقل قول: بحث، گفتگو، آموزش پیرامون برنامه نویسی سرویس ویندوزهای ان.تی

    نقل قول نوشته شده توسط AbbasVB مشاهده تاپیک
    سلام

    در رابطه با مالتی تردینگ خیلی اطلاعات ندارم خوبه یه خورده هم در این رابطه توضیح بدید

    حالا که تاپیک داره داغ می شه چند تا سوال:
    اول آیا میشه وقتی سرویس داره خاموش می شه خود سرویس بفهمه و از کاربر اجازه بگیره یا یک برنامه دیگه منتظر باشه هر موقع به سرویس پیغام ارسال شد ابتدا برنامه ای که در حالت عادی هست بفهمه و در صورت تایید کاربر سرویس رو ببنده؟
    اول اینکه درمورد مالتی تردینگ همون چیزی که فکر میکردم، درست بود و مشکلش حل شد (منظورم همون TypeLib یا همون فایل lib به جای declare کردن معمولی توابع API) سر فرصت یه تاپیک جدید میزنم و توضیحشو میدم (چونکه روش اتوماتیکی برای این کار نیست و همه چیز باید دستی انجام بشه تا فایل lib رو بسازیم بعدش که دیگه همه چیز به روال معمولی انجام میشه...)

    سوال اول:
    در روش ntsvc.ocx توسط رویداد زیر

    Private Sub NTService1_Stop()

    End Sub


    و درمورد روش AbbasVB جان توسط رویداد زیر

    Private Sub Handler(ByVal fdwControl As Long)
    Select Case fdwControl
    Case SERVICE_CONTROL_SHUTDOWN, SERVICE_CONTROL_STOP
    SetServiceState SERVICE_STOP_PENDING
    SetEvent hStopPendingEvent
    Case Else
    SetServiceState
    End Select
    End Sub


    متوجه میشیم که سرویس حالا به هر دلیلی داره بسته میشه... شات دان شدن یا ارسال دستور stop (شکل زیر)

    stop.gif


    اما اینکه بخواهیم جلوی بسته شدن سرویس رو بگیریم

    در روش ntsvc.ocx یا وجود نداره یا من بلد نیستم...

    ولی در روش AbbasVB به راحتی میشه دستور ارسال شده رو نادیده گرفت و برنامه به کار عادی خودش ادامه بده... اینجوری:

    Private Sub Handler(ByVal fdwControl As Long)
    Select Case fdwControl
    Case SERVICE_CONTROL_SHUTDOWN
    SetServiceState SERVICE_STOP_PENDING
    SetEvent hStopPendingEvent
    Case SERVICE_CONTROL_STOP
    'Do Nothing... he he he...
    Case Else
    SetServiceState
    End Select
    End Sub


    در این حالت حتی سیستم هم اونو EndProcess نمیکنه(خیالتون راحت)

    اما خوب یه کاربر میتونه اونو خودش دستی EndProcess کنه...

    نگران نباشید چون یه روش تو آستینم دارم...
    با تنظیم خصوصیات زیر، با endProcess شدن، سیستم زحمت میکشه و دوباره سرویس ما رو اجرا میکنه

    start.gif

    البته ممکنه یه کاربر دیگه بیاد و تنظیمات رو برگردونه...


    ولی اینکه گفتید آنتی ویروسا چون سرویس هستند بسته نمیشن رو اصلا قبول ندارم...

    اینگونه نرم افزار ها با هوک کردن توابعی که باعث EndProcess شدن میشن، اونو دور میزنن...
    که من هم در موردش هیچی نمیدونم...



    دوتا سوال دیگه هم پرسیده بودید که جوابشو بلد نبودم... راه حل که داره ولی باید سرچ کنم...قبلن هم دیده بودم که بچه های C++‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎ این سوالا رو میپرسن...



    کلا تاپیک خوبی شده باید یه چند وقتی اون بالا بالا ها بمونه
    آخرین ویرایش به وسیله meys34 : جمعه 06 بهمن 1391 در 19:04 عصر

  19. #19
    کاربر دائمی آواتار Mr'Jamshidy
    تاریخ عضویت
    مرداد 1386
    محل زندگی
    Network
    پست
    994

    نقل قول: بحث، گفتگو، آموزش پیرامون برنامه نویسی سرویس ویندوزهای ان.تی

    نقل قول نوشته شده توسط meys34 مشاهده تاپیک
    اول اینکه درمورد مالتی تردینگ همون چیزی که فکر میکردم، درست بود و مشکلش حل شد (منظورم همون TypeLib یا همون فایل lib به جای declare کردن معمولی توابع API) سر فرصت یه تاپیک جدید میزنم و توضیحشو میدم (چونکه روش اتوماتیکی برای این کار نیست و همه چیز باید دستی انجام بشه تا فایل lib رو بسازیم بعدش که دیگه همه چیز به روال معمولی انجام میشه...)

    سوال اول:
    در روش ntsvc.ocx توسط رویداد زیر

    Private Sub NTService1_Stop()

    End Sub


    و درمورد روش AbbasVB جان توسط رویداد زیر

    Private Sub Handler(ByVal fdwControl As Long)
    Select Case fdwControl
    Case SERVICE_CONTROL_SHUTDOWN, SERVICE_CONTROL_STOP
    SetServiceState SERVICE_STOP_PENDING
    SetEvent hStopPendingEvent
    Case Else
    SetServiceState
    End Select
    End Sub


    متوجه میشیم که سرویس حالا به هر دلیلی داره بسته میشه... شات دان شدن یا ارسال دستور stop (شکل زیر)

    stop.gif


    اما اینکه بخواهیم جلوی بسته شدن سرویس رو بگیریم

    در روش ntsvc.ocx یا وجود نداره یا من بلد نیستم...

    ولی در روش AbbasVB به راحتی میشه دستور ارسال شده رو نادیده گرفت و برنامه به کار عادی خودش ادامه بده... اینجوری:

    Private Sub Handler(ByVal fdwControl As Long)
    Select Case fdwControl
    Case SERVICE_CONTROL_SHUTDOWN
    SetServiceState SERVICE_STOP_PENDING
    SetEvent hStopPendingEvent
    Case SERVICE_CONTROL_STOP
    'Do Nothing... he he he...
    Case Else
    SetServiceState
    End Select
    End Sub


    در این حالت حتی سیستم هم اونو EndProcess نمیکنه(خیالتون راحت)

    اما خوب یه کاربر میتونه اونو خودش دستی EndProcess کنه...

    نگران نباشید چون یه روش تو آستینم دارم...
    با تنظیم خصوصیات زیر، با endProcess شدن، سیستم زحمت میکشه و دوباره سرویس ما رو اجرا میکنه

    start.gif

    البته ممکنه یه کاربر دیگه بیاد و تنظیمات رو برگردونه...


    ولی اینکه گفتید آنتی ویروسا چون سرویس هستند بسته نمیشن رو اصلا قبول ندارم...

    اینگونه نرم افزار ها با هوک کردن توابعی که باعث EndProcess شدن میشن، اونو دور میزنن...
    که من هم در موردش هیچی نمیدونم...



    دوتا سوال دیگه هم پرسیده بودید که جوابشو بلد نبودم... راه حل که داره ولی باید سرچ کنم...قبلن هم دیده بودم که بچه های C++‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎ این سوالا رو میپرسن...



    کلا تاپیک خوبی شده باید یه چند وقتی اون بالا بالا ها بمونه
    اول از همه دستت درد نکنه در مورد اطلاعاتی که دادی

    2. تاپیک جدید برای چی؟

    3. کسی نگفت چون آنتی ها سرویس هستن این کار رو میکنن ولی چون سرویس هستن دستشون برای انجام همچین کارایی باز تره وگرنه ویروس نمیومد 3 سوت آنتی رو ببنده

    4. با هوک کردن این کار رو نمیشه انجام هوک تقریبا یک جور زیر نظر گرفتن هست شما باید کد رو به برنامه مورد نظر تزریق کنی تا نتونه کد اصلی EndProcess رو اجرا کنه

    که در مورد تزریق هم چیزای زیادی پیدا میشه

  20. #20

    نقل قول: بحث، گفتگو، آموزش پیرامون برنامه نویسی سرویس ویندوزهای ان.تی

    خوب چطور میشه کد ها تزریق کرد؟
    و واقعا بشه جلوی بسته شدن برنامه رو از طریق پروسس منیجر های مختلف گرفت؟
    آیا کسی هم میدونه ک چطور میشه مثل انتی ویروس کسپراسکای و نمونه های دیگه از پوشه ای ک برنامه داخلش هست محافظت کرد؟(هیچ گونه تغییری صورت نمیگیره و فقط خوده برنامه میتونه تیو اون پوشه تغییرات بده)

    ممنون واقعا تاپیک عالی شده
    موفق باشید

  21. #21
    کاربر دائمی
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    MsgBox barnamenevis.org
    پست
    540

    Talking نقل قول: بحث، گفتگو، آموزش پیرامون برنامه نویسی سرویس ویندوزهای ان.تی

    سلام... دوباره من اومدم... اومدم تا جواب سوال 2 و 3 رو بدم...

    نقل قول نوشته شده توسط AbbasVB مشاهده تاپیک
    دوم چه طور بین یک سرویس و برنامه رابطه بر قرار کنیم مثل آنتی ویروس ها یک سرویس و یک رابط گرافیکی؟
    سوم چطور یک برنامه رو توسط سرویس در محیط عادی اجرا کنیم؟(چون سرویس هر برنامه ای رو که اجرا می کنه در همون محیط سرویسه اجا می شه و بسته می شه)

    دوستان نیستید!

    چرا توی بحث شرکت نمی کنید تا استفاده کنیم؟

    من هستم نگران نباش...

    سوال سوم:
    وقتی سرویس شما اجرا شد توسط کد زیر (اون پایین) میتونید یه نرم افزار رو تو محیط "یوزر (اونی که فعال هست)" اجرا کنید...

    سوال دوم:
    توی ویندوز 98 این امکان فراهم بود که سرویس، رابط گرافیکی (Interactive) مستقیمی توی صفحه نمایش داشته باشه... مثلا پیغام Msgbox مستقیم تو صفحه نمایش داده بشه... توی وین xp و 7 این حالت تغییر کرد و به طور غیر مستقیم نمایش داده میشه... توضیحش دیگه بماند...
    ولی توی وین 8 کلا این امکان حذف شده... به همین خاطر مجبوریم یه رابط کاربری بسازیم و پس از اجرای سرویس اونو اجرا کنیم به روش زیر (یکمی پایینتر)...

    توضیحات ارسال پارامتر و ارتباط بین سرویس و رابط کاربری رو هم که مستر جان دادند...




    منبع

    Execute programs from a LocalSystem service onto the users desktop

    کد زیر به روش NTSVC.ocx تست شد جواب میده...

    کد زیر اصلاح شد... ایراد مربوط به RunAsAdmin بود...


    ' UserProcess.bas
    ' Execute programs from a LocalSystem service onto the users desktop.

    Option Explicit
    ' egl1044
    Private Const CREATE_UNICODE_ENVIRONMENT As Long = &H400&

    ' <(Unicode)>
    Private Type STARTUPINFO
    cb As Long
    lpReserved As Long 'wsptr
    lpDesktop As Long 'wsptr
    lpTitle As Long 'wsptr
    dwX As Long
    dwY As Long
    dwXSize As Long
    dwXCountChars As Long
    dwYCountChars As Long
    dwFillAttribute As Long
    dwFlags As Long
    wShowWindow As Integer
    cbReserved2 As Integer
    lpReserved2 As Long 'ptr
    hStdInput As Long 'ptr
    hStdOutput As Long 'ptr
    hStdError As Long 'ptr
    End Type

    Private Type PROCESS_INFORMATION
    hProcess As Long 'ptr
    hThread As Long 'ptr
    dwProcessID As Long
    dwThreadID As Long
    End Type

    Private Type SECURITY_ATTRIBUTES
    Length As Long
    lpSecurityDescriptor As Long 'ptr
    bInheritHandle As Long
    End Type

    ' <(Unicode)>
    Private Declare Function CreateProcessAsUserW Lib "Advapi32.dll" (ByVal hToken As Long, ByVal lpApplicationName As Long, ByVal lpCommandLine As Long, ByRef lpProcessAttributes As SECURITY_ATTRIBUTES, ByRef lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandle As Long, ByVal dwCreationFlags As Long, ByVal lpEnvrionment As Long, ByVal lpCurrentDirectory As Long, ByRef lpStartupInfo As STARTUPINFO, ByRef lpProcessInformation As PROCESS_INFORMATION) As Long

    Private Declare Function CreateEnvironmentBlock Lib "Userenv.dll" (ByRef lpEnvironment As Long, ByVal hToken As Long, ByVal bInherit As Long) As Long

    Private Declare Function DestroyEnvironmentBlock Lib "Userenv.dll" (ByVal lpEnvironment As Long) As Long

    Private Declare Function WTSQueryUserToken Lib "Wtsapi32.dll" (ByVal sessionId As Long, ByRef phToken As Long) As Long

    Private Declare Function WTSGetActiveConsoleSessionId Lib "Kernel32.dll" () As Long

    Private Declare Function CloseHandle Lib "Kernel32.dll" (ByVal hObject As Long) As Long

    '************************************************* ************************
    Private Declare Function GetTokenInformation Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal TokenInformationClass As Integer, TokenInformation As Any, ByVal TokenInformationLength As Long, ReturnLength As Long) As Long


    Public Enum RunAs
    requireAdministrator
    asInvoke
    End Enum

    Public Sub ServiceShell(ByVal fileName As String, Optional ByVal sessionId As Long = (-1), Optional ByVal RunAsAdmin As RunAs = asInvoke)

    Dim hToken As Long
    Dim pEnvBlock As Long
    Dim dwSessionId As Long
    Dim sa As SECURITY_ATTRIBUTES
    Dim pi As PROCESS_INFORMATION
    Dim si As STARTUPINFO

    ' If no session Id was specified defaults to using the session Id
    ' that is currently attached to the physical console.
    If sessionId = (-1) Then

    dwSessionId = WTSGetActiveConsoleSessionId()

    Else

    dwSessionId = sessionId

    End If


    ' Obtain the primary access token of the logged-on user specified by the session Id
    If WTSQueryUserToken(dwSessionId, hToken) Then

    ' Get the enviorment block pointer for the user session.
    If CreateEnvironmentBlock(pEnvBlock, hToken, 0) Then
    ' si.cb = Len(si)
    ' si.wShowWindow = 5 'vbMaximizedFocus
    ' si.dwFlags = 1 'STARTF_USESHOWWINDOW

    If RunAsAdmin = requireAdministrator Then GetAdminToken hToken

    If CreateProcessAsUserW(hToken, StrPtr(fileName), 0, sa, sa, 0, _
    CREATE_UNICODE_ENVIRONMENT, pEnvBlock, 0, si, pi) Then

    ' cleanup handle information
    CloseHandle pi.hProcess
    CloseHandle pi.hThread
    '************************************RUN AS ADMIN********************************************
    ElseIf Err.LastDllError = 740 Then '740=ERROR_ELEVATION_REQUIRED (The requested operation requires elevation.)

    GetAdminToken hToken

    If CreateProcessAsUserW(hToken, StrPtr(fileName), 0, sa, sa, 0, _
    CREATE_UNICODE_ENVIRONMENT, pEnvBlock, 0, si, pi) Then

    ' cleanup handle information
    CloseHandle pi.hProcess
    CloseHandle pi.hThread
    Else

    SaveSetting "p", "P", "P2", Err.LastDllError
    End If

    CloseHandle hToken

    Else
    SaveSetting "p", "P", "P1", Err.LastDllError

    End If

    ' Destroy enviorment block pointer.
    DestroyEnvironmentBlock pEnvBlock

    End If

    ' cleanup user session token handle.
    CloseHandle hToken

    End If
    End Sub

    Private Sub GetAdminToken(ByRef hToken As Long)
    Dim hNewToken As Long
    Dim TokenLen As Long

    GetTokenInformation hToken, 19, hNewToken, 4, TokenLen '19 = LinkedToken = A Handle To a Users Token With ADMIN Privilege
    hToken = hNewToken

    End Sub
    آخرین ویرایش به وسیله meys34 : پنج شنبه 10 اسفند 1391 در 11:39 صبح دلیل: اصلاح مجدد کدها

  22. #22

    نقل قول: بحث، گفتگو، آموزش پیرامون برنامه نویسی سرویس ویندوزهای ان.تی

    دوستان باقی این مسئله رو نمیگن؟
    سوال های ما هم جواب بدین بابا
    تاپیک خوبیه حیفه

  23. #23
    کاربر دائمی
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    MsgBox barnamenevis.org
    پست
    540

    نقل قول: بحث، گفتگو، آموزش پیرامون برنامه نویسی سرویس ویندوزهای ان.تی

    نقل قول نوشته شده توسط Hashemvp مشاهده تاپیک
    دوستان باقی این مسئله رو نمیگن؟
    سوال های ما هم جواب بدین بابا
    تاپیک خوبیه حیفه
    سلام من هنوز هستم.... فعلا کد پست قبلیم رو اصلاح کردم تا بعدا ادامه بدم...

  24. #24

    نقل قول: بحث، گفتگو، آموزش پیرامون برنامه نویسی سرویس ویندوزهای ان.تی

    قربانت پس بی زحمت اگه میدونی جواب سوال های قبلی منو بده کسی جواب نداد
    نقل قول نوشته شده توسط Hashemvp مشاهده تاپیک
    خوب چطور میشه کد ها تزریق کرد؟
    و واقعا بشه جلوی بسته شدن برنامه رو از طریق پروسس منیجر های مختلف گرفت؟
    آیا کسی هم میدونه ک چطور میشه مثل انتی ویروس کسپراسکای و نمونه های دیگه از پوشه ای ک برنامه داخلش هست محافظت کرد؟(هیچ گونه تغییری صورت نمیگیره و فقط خوده برنامه میتونه تیو اون پوشه تغییرات بده)

    ممنون واقعا تاپیک عالی شده
    موفق باشید
    ممنون

تاپیک های مشابه

  1. درخواست آموزش کامل برنامه نویسی با دلفی برای بانک های اطلاعاتی
    نوشته شده توسط jalal95 در بخش بانک های اطلاعاتی در Delphi
    پاسخ: 16
    آخرین پست: سه شنبه 30 مهر 1387, 09:04 صبح
  2. آموزش مقدماتی برنامه نویسی موبایل
    نوشته شده توسط vahidm در بخش برنامه نویسی موبایل
    پاسخ: 3
    آخرین پست: دوشنبه 20 خرداد 1387, 11:39 صبح
  3. آموزش فارسی برنامه نویسی برای شبکه
    نوشته شده توسط Mohsen6558 در بخش برنامه نویسی در 6 VB
    پاسخ: 0
    آخرین پست: سه شنبه 15 خرداد 1386, 13:10 عصر
  4. برنامه نویسی سرویس ویندوز
    نوشته شده توسط iman_s52 در بخش C#‎‎
    پاسخ: 3
    آخرین پست: شنبه 01 مهر 1385, 06:55 صبح

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •