سئوالات مربوط به Windows Api

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
وقتی میخوایم یه رویدادی که به توابع api مربوط میشه رو بسازیم (مثلا رویدادی که سرویس windows update اگه startup type اش تغییر کرد ، کدی را اجرا کنه) ، در این صورت اولا از توی توابع دات نت (در سی شارپ) که نمیشه کاری کرد؟ درسته؟ دوما توی api ها از قسمت windows message & notification هم که نمیشه استفاده کرد . میشه؟
پس یه راهی میمونه اینه که توی تایمر ، مدام چک کنیم ببینیم این نوع startup type تغییر کرد یا نه؟
راه بهتر دیگه ای نیست . هست؟
 

the_king

مدیرکل انجمن
سلام
وقتی میخوایم یه رویدادی که به توابع api مربوط میشه رو بسازیم (مثلا رویدادی که سرویس windows update اگه startup type اش تغییر کرد ، کدی را اجرا کنه) ، در این صورت اولا از توی توابع دات نت (در سی شارپ) که نمیشه کاری کرد؟ درسته؟ دوما توی api ها از قسمت windows message & notification هم که نمیشه استفاده کرد . میشه؟
پس یه راهی میمونه اینه که توی تایمر ، مدام چک کنیم ببینیم این نوع startup type تغییر کرد یا نه؟
راه بهتر دیگه ای نیست . هست؟
سوال تون البته ربطی به API پیدا نکرد. ویندوز کلا رخداد محور ئه. از نظر فنی پنجره تون میتونه هر پیامی رو دریافت کنه، اما مساله اینه که اول باید یک منبع برای ارسال اون پیام باشه، وقتی موردی از قبل پیش بینی نشده باشه که برای یک رخداد مشخص همچین پیامی ایجاد کنه، چیزی نیست که بخواهید Hook اش کنید و پیام رو دریافت کنید. مایکروسافت الزاما برای هر موردی رخدادی همچین چیزی نداره. سیستم ویندوز برای یکسری رخداد ها خودش سیستم Log داره که بررسی اش کنید اما باید بررسی کنید ببینید چیز هایی که میخواهید داخلش هست یا نه. قطعا همه موارد رو Log نمی کنه.

کد:
        private DataGridView _grid;

        private void Form1_Load(object sender, EventArgs e)
        {
            _grid = new DataGridView { Dock = DockStyle.Fill, ReadOnly = true, RowHeadersVisible = false, AllowUserToAddRows = false, AllowUserToDeleteRows = false, AllowUserToResizeRows = false, Parent = this };
            _grid.Columns.Add("InstanceId", "Instance ID");
            _grid.Columns.Add("Category", "Category");
            _grid.Columns.Add("Message", "Message");
            _grid.Columns["Message"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            var appLog = new EventLog("Application");
            appLog.EntryWritten += LogListener_EntryWritten;
            appLog.EnableRaisingEvents = true;
            var sysLog = new EventLog("System");
            sysLog.EntryWritten += LogListener_EntryWritten;
            sysLog.EnableRaisingEvents = true;
            var securityLog = new EventLog("Security");
            securityLog.EntryWritten += LogListener_EntryWritten;
            securityLog.EnableRaisingEvents = true;
        }

        private void AddItem(object obj)
        {
            var entry = (EventLogEntry)obj;
            _grid.Rows.Add(entry.InstanceId, entry.Category, entry.Message);
        }

        private void LogListener_EntryWritten(object sender, EntryWrittenEventArgs e)
        {
            Invoke(new ParameterizedThreadStart(AddItem), e.Entry);
        }
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
ممنون استاد علی
نمیدونستم برای این کارها یه کلاسی در دات نت تعریف شد . فکر میکردم باید با api ویندوز برم
ممنون از کدتون
شی EventLog که با "Security" ساخته شده ، ارور میده
کاربرد "Application" رو متوجه نشدم چیه
بعد اینکه اگه رویدادهای دیگه ای رو هم بخوام مدیریت کنیم ، چی؟ مثلا فرض کنید یه پلاگین کنترل بصری (مثلا فلش) هست که بخوایم یه رویدادش (مثلا کلیک راست اش) رو مدیریت کنیم ، با این کلاس EventLog میشه؟ (منظورم انواع مدیریت رویدادهای هر نوع ویندوز یا کنترلی هه)
یا اینکه یه رویداد دیگه ای مثلا وقتی که فلش رو به سیستم وصل میکنیم یا وقتی که فایلی را حذف یا فایلی را کپی میکنیم ، مدیریت کنیم ، با همین کلاس میشه؟
 

the_king

مدیرکل انجمن
سلام
شی EventLog که با "Security" ساخته شده ، ارور میده

باید متن خطا رو بررسی کنید تا معلوم بشه دلیلش چیه، مثلا عدم دسترسی کاربری تون و غیره.
کاربرد "Application" رو متوجه نشدم چیه
کدوم منابع رو در موردش جستجو و مطالعه کردید؟

بعد اینکه اگه رویدادهای دیگه ای رو هم بخوام مدیریت کنیم ، چی؟ مثلا فرض کنید یه پلاگین کنترل بصری (مثلا فلش) هست که بخوایم یه رویدادش (مثلا کلیک راست اش) رو مدیریت کنیم ، با این کلاس EventLog میشه؟ (منظورم انواع مدیریت رویدادهای هر نوع ویندوز یا کنترلی هه)
یا اینکه یه رویداد دیگه ای مثلا وقتی که فلش رو به سیستم وصل میکنیم یا وقتی که فایلی را حذف یا فایلی را کپی میکنیم ، مدیریت کنیم ، با همین کلاس میشه؟
نه. ابدا. EventLog برای رویداد های سیستمی ئه که ارزش نگهداری و ثبت شدن رو دارند. کلیک روی یک پنجره چیزی نیست که به این قضیه ربط پیدا کنه. بخش های اساسی سیستم Watcher دارند مثل FileSystemWatcher که بشه روی عملیات شون نظارت داشت اما ممکنه بنا به شرایط امنیتی برنامه های عادی روی بخش هایی دسترسی داشته باشند و برای بخش های محدود شده لازم باشه با کمک درایور نظارت کنید.
کد:
        private DataGridView _grid;

        private void Form1_Load(object sender, EventArgs e)
        {
            _grid = new DataGridView { Dock = DockStyle.Fill, ReadOnly = true, RowHeadersVisible = false, AllowUserToAddRows = false, AllowUserToDeleteRows = false, AllowUserToResizeRows = false, Parent = this };
            _grid.Columns.Add("FullPath", "Full Path");
            _grid.Columns["FullPath"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            var watcher = new FileSystemWatcher(@"D:\", "*.txt") { IncludeSubdirectories = true };
            watcher.Deleted += Watcher_Deleted;
            watcher.EnableRaisingEvents = true;
        }

        private void Watcher_Deleted(object sender, FileSystemEventArgs e)
        {
            Invoke(new ParameterizedThreadStart(AddItem), e.FullPath);
        }

        private void AddItem(object obj)
        {
            var fullPath = (string)obj;
            _grid.Rows.Add(fullPath);
        }
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
باید متن خطا رو بررسی کنید تا معلوم بشه دلیلش چیه، مثلا عدم دسترسی کاربری تون و غیره.
ممنون استاد علی
متن خطاش اینه :

کد:
System.Security.SecurityException: 'Requested registry access is not allowed.'

کدوم منابع رو در موردش جستجو و مطالعه کردید؟
در لینک زیر ، قسمت remark یکی دو خط در این باره گفت که متوجه نشدم :
EventLog.Log Property (System.Diagnostics)


نه. ابدا. EventLog برای رویداد های سیستمی ئه که ارزش نگهداری و ثبت شدن رو دارند. کلیک روی یک پنجره چیزی نیست که به این قضیه ربط پیدا کنه. بخش های اساسی سیستم Watcher دارند مثل FileSystemWatcher که بشه روی عملیات شون نظارت داشت اما ممکنه بنا به شرایط امنیتی برنامه های عادی روی بخش هایی دسترسی داشته باشند و برای بخش های محدود شده لازم باشه با کمک درایور نظارت کنید.
کد:
        private DataGridView _grid;

        private void Form1_Load(object sender, EventArgs e)
        {
            _grid = new DataGridView { Dock = DockStyle.Fill, ReadOnly = true, RowHeadersVisible = false, AllowUserToAddRows = false, AllowUserToDeleteRows = false, AllowUserToResizeRows = false, Parent = this };
            _grid.Columns.Add("FullPath", "Full Path");
            _grid.Columns["FullPath"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            var watcher = new FileSystemWatcher(@"D:\", "*.txt") { IncludeSubdirectories = true };
            watcher.Deleted += Watcher_Deleted;
            watcher.EnableRaisingEvents = true;
        }

        private void Watcher_Deleted(object sender, FileSystemEventArgs e)
        {
            Invoke(new ParameterizedThreadStart(AddItem), e.FullPath);
        }

        private void AddItem(object obj)
        {
            var fullPath = (string)obj;
            _grid.Rows.Add(fullPath);
        }

ممنون از کدتون
چند تا سئوال دارم :
1) پروپرتی ای هست که بشه فهمید کدوم سرویس چه رویدادی براش اتفاق افتاد؟ یا فقط باید از دلِ پروپرتی Message چک کنیم نام اون رویداد مربوط به سرویسی که اجرا شد را؟ یا باید از طریق id اش متوجه شد؟
2) رویداد چه زمانی اجرا میشه؟ الان مثلا سرویس windows update را start میکنیم ، رویداد اجرا میشه ولی stop که میکنیم ، نمیشه . startup time اش تغییر میکنه ، اجرا میشه ولی تنظیمات در سربرگ های دیگه که تغییر میکنه (مثلا سربرگ recovery) ، رویدادش اجرا نمیشه
3) ممنون از کدتون . حالا مثلا برای اتصال فلش (یا کلا دستگاه usb جدید) ، کلاسی هست که این رویداد را هندل کنه؟ کد لازم نیست بدین . فقط نام کلاس را بگین ، چک میکنم
4) چرا در این کلاس ها ، یه پروپرتی EnableRaisingEvents میذارن؟ مثل بقیه ی رویدادها (مثلا رویداد click دکمه) ، اگه طرف بخواد رویدادی را هندل کنه ، خوب تابع و دلیگیت مربوط به اون رویداد را بهش میده و اگه نخواد ، نمیده یا از عملگر =- استفاده میکنه . (البته اینم همینطوره) ولی دیگه پروپرتی EnableRaisingEvents را جداگانه برای فعال کردن هندل رویداد میذارن ، چه معنی ای داره؟!
 

the_king

مدیرکل انجمن
ممنون استاد علی
متن خطاش اینه :

کد:
System.Security.SecurityException: 'Requested registry access is not allowed.'
متن خطا واضحه دیگه، نیاز به دسترسی خاصی به بخشی از Registry داره که برای کاربر فعلی قابل دسترسی نیست.

در لینک زیر ، قسمت remark یکی دو خط در این باره گفت که متوجه نشدم :
EventLog.Log Property (System.Diagnostics)
توضیحی که میده مربوط به یک پروپرتی ئه، الزاما توضیح کاملی در مورد ساختار ویندوز که داخلش نخواهد بود.
Event Sources
The Security log is for system use only. Device drivers should add their names to the System log. Applications and services should add their names to the Application log or create a custom log.
ممنون از کدتون
چند تا سئوال دارم :
1) پروپرتی ای هست که بشه فهمید کدوم سرویس چه رویدادی براش اتفاق افتاد؟ یا فقط باید از دلِ پروپرتی Message چک کنیم نام اون رویداد مربوط به سرویسی که اجرا شد را؟ یا باید از طریق id اش متوجه شد؟

چه اتفاقی براش افتاد که یک گزینه از بین چند تا اتفاق مشخص که نیست، نه محدودیتی در جزئیات رخداد هست و نه قالب و ساختار ثابتی داره، به همین جهت هر جور تفسیری که بخواهید برای داده ها در نظر بگیرید برای یکسری موارد صدق می کنه و برای سایر موارد خیر. در منوی Start عبارت Event Viewer رو جستجو کنید و در Event Viewer که جزو ابزار های استاندارد ادمین ویندوز ئه Log ها رو بررسی کنید. مخصوصا در گروه System جزئیات Information ها (Param1 و Param2) را ببینید.
2) رویداد چه زمانی اجرا میشه؟ الان مثلا سرویس windows update را start میکنیم ، رویداد اجرا میشه ولی stop که میکنیم ، نمیشه . startup time اش تغییر میکنه ، اجرا میشه ولی تنظیمات در سربرگ های دیگه که تغییر میکنه (مثلا سربرگ recovery) ، رویدادش اجرا نمیشه

رویداد زمانی به قول شما اجرا میشه که جایی ایجاد بشه. اما وقوع رویداد که ربطی به ثبت شدنش نداره. وقتی کارمند وارد اداره میشه یا اداره رو ترک می کنه ثبت رویداد مفیده ولی وقتی چایی میخوره که رویدادش کاربرد خاصی نداره که نیازی به ثبت اش باشه. قرار نیست که همه رویداد های ریز و درشت در حافظه ثبت بشوند.
3) ممنون از کدتون . حالا مثلا برای اتصال فلش (یا کلا دستگاه usb جدید) ، کلاسی هست که این رویداد را هندل کنه؟ کد لازم نیست بدین . فقط نام کلاس را بگین ، چک میکنم
معماری PC باز ئه و ویندوز هم بر این اساس ممکنه انواع مختلفی از سخت افزار ها و پورت های ورودی رو بکار ببره که بدون درایور شناخته شده نیستند.
رخداد های سخت افزاری اینطوری نیست که یک رخداد برای وصل کردن ماوس باشه، یک رخداد برای وصل کردن قلم نوری، یک رخداد برای وصل کردن صفحه کلید و ...
و از اونجایی که تعداد پورت ها و ماهیت شون هم میتونه خیلی متفاوت باشه بر اساس USB و e-SATA و Firewire و thunderbolt و ... بودنشون هم نیست. خیلی کلی تر از این حرفا است. یک تغییر رخ میده، رخدادی اتفاق می افته، بعد بر اساس جزئیات رخداد ممکنه عملیات های متفاوتی انجام بشه تا معلوم بشه تغییر مربوط به چه موردیه. در مورد پیام WM_DEVICECHANGE جستجو کنید، وقتی تغییری در وضعیت سخت افزاری پیش میاد که فرضا فلش درایوی متصل میشه به پنجره اصلی تمامی برنامه ها این پیام ارسال میشه.
4) چرا در این کلاس ها ، یه پروپرتی EnableRaisingEvents میذارن؟ مثل بقیه ی رویدادها (مثلا رویداد click دکمه) ، اگه طرف بخواد رویدادی را هندل کنه ، خوب تابع و دلیگیت مربوط به اون رویداد را بهش میده و اگه نخواد ، نمیده یا از عملگر =- استفاده میکنه . (البته اینم همینطوره) ولی دیگه پروپرتی EnableRaisingEvents را جداگانه برای فعال کردن هندل رویداد میذارن ، چه معنی ای داره؟!
کلیک ماوس تو همون نخ ای رخ میده که دارید به متد وصلش می کنید، همزمان که نخ دو تا کد رو اجرا نمی کنه، برای همین تا وقتی کد اون روال به انتها نرسید و کلیکی هم نمیتونه رخ بده. پس تداخل و مشکلی در کار نیست.
اما اون رخداد ها که داره Log میشه منبع شون پروسه های متفاوتی ئه، پشت سر هم مسلسل وار رخداد ئه که داره اتفاق می افته، هیچ ارتباطی هم با پروسه و نخ برنامه شما ندارند که همزمانی داشته باشند، نخی که اجازه نظارت بر رخداد ها رو میده نخی نیست که رخداد رو نظارت می کنه. به همین جهت فقط باید زمانی اجازه نظارت روی رخداد ها داده بشه که برنامه کاملا آمادگی اش رو داره، اگر در حین برقراری اتصال وسط کار رخدادی اتفاق بیافته امکان اجرای ناقص یا کرش کردن هست، برای همین چطور که وقتی شیر فلکه رو عوض می کنند، اول باید جریان پر فشار از بیرون قطع بشه و تا وقتی شیر فلکه متصل نشده جریان رو مجددا باز نمی کنند، مادامی که EnableRaisingEvents تایید نکنه جریان به سمت متد هدایت نمیشه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
متن خطا واضحه دیگه، نیاز به دسترسی خاصی به بخشی از Registry داره که برای کاربر فعلی قابل دسترسی نیست.

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


کد:
            ServiceController winUpdateService = new ServiceController("Windows Update");
            if (winUpdateService.CanStop == true)
            {
                winUpdateService.Stop();
            }
خطاش اینه :
کد:
System.InvalidOperationException: 'Cannot open wuauserv service on computer '.'.'
بعد هم در ادامه ی متن اش :
کد:
Win32Exception: Access is denied
کلا باید چی کار کرد؟
بعد اینکه برای تغییر startup type (در سرویس آپدیت ویندوز) باید از تابع ChangeServiceConfig در api استفاده کنم دیگه؟ منظورم اینه که کلاس دات نت ای برای این کار وجود نداره دیگه؟ درسته؟
 
آخرین ویرایش:

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
انگار باید پروژه را بصورت run as administrator کرد
برای این کار هم انگار باید فایل manifest را دستکاری کرد
من این فایل را نمیتونم توی پروژه ام پیدا کنم . کجاست؟
در لینک زیر :
Stop/Start service in code in Windows 7
ایناها را گفته :
1.1. Right click your project
1.2. Click "Properties"
1.3. Select "Application" tab - default page
1.4. Click "View UAC Settings" - This button opens the application manifest file (app.manifest)
1.5. Look for the "UAC Manifest Options" section
1.6. Remove or comment the current entry - {requestedExecutionLevel level="asInvoker" uiAccess="false"}
1.7. Change to {requestedExecutionLevel level="requireAdministrator" uiAccess="false"}. MS provides your 3 options as part of the section comment.
ولی من در بخش 1.4 اش گیر کردم و چیزی بنام "View UAC Settings" رو پیدا نمیکنم!
 

the_king

مدیرکل انجمن
انگار باید پروژه را بصورت run as administrator کرد
برای این کار هم انگار باید فایل manifest را دستکاری کرد
من این فایل را نمیتونم توی پروژه ام پیدا کنم . کجاست؟
در لینک زیر :
Stop/Start service in code in Windows 7
ایناها را گفته :
1.1. Right click your project
1.2. Click "Properties"
1.3. Select "Application" tab - default page
1.4. Click "View UAC Settings" - This button opens the application manifest file (app.manifest)
1.5. Look for the "UAC Manifest Options" section
1.6. Remove or comment the current entry - {requestedExecutionLevel level="asInvoker" uiAccess="false"}
1.7. Change to {requestedExecutionLevel level="requireAdministrator" uiAccess="false"}. MS provides your 3 options as part of the section comment.
ولی من در بخش 1.4 اش گیر کردم و چیزی بنام "View UAC Settings" رو پیدا نمیکنم!
در پروژه تون همانطور که از منوی Project کلاس و فایل جدید اضافه می کنید Add New Item رو انتخاب کنید و یک Application Manifest File بهش اضافه کنید. app.manifest همون فایلی است که کنار فایل اجرایی و با همون اسم با پسوند manifest ایجاد میشه و اطلاعات جانبی مثل همون UAC Manifest Options داخلش ثبت میشه. از نظر فنی میتونه manifest جزئی از resource های داخل فایل اجرایی هم باشه، الزاما فایل خارجی نیست.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
متوجه شدم . اول باید فایل manifest رو ساخت (
در پروژه تون همانطور که از منوی Project کلاس و فایل جدید اضافه می کنید Add New Item رو انتخاب کنید و یک Application Manifest File بهش اضافه کنید. app.manifest همون فایلی است که کنار فایل اجرایی و با همون اسم با پسوند manifest ایجاد میشه و اطلاعات جانبی مثل همون UAC Manifest Options داخلش ثبت میشه. از نظر فنی میتونه manifest جزئی از resource های داخل فایل اجرایی هم باشه، الزاما فایل خارجی نیست.

بله
ممنون استاد علی
و بعد از ایجاد شدن این فایل (که بصورت پیش فرض حاوی اطلاعاتی هست) ، مقدار requestedExecutionLevel را باید به requireAdministrator تغییر بدیم :


کد:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

الان هم درست شد و هیچ کدوم از اون دو کد ، ارور نمیدن
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
در بعضی از توابع winapi در پارامترهاشون نوشته _In_ و در بعضی هاشون هم نوشته _Out_ و در بعضی هاشون هم هر دو رو با هم
این به چه معناست؟
opt که یعنی اختیاری
 

the_king

مدیرکل انجمن
در بعضی از توابع winapi در پارامترهاشون نوشته _In_ و در بعضی هاشون هم نوشته _Out_ و در بعضی هاشون هم هر دو رو با هم
این به چه معناست؟
opt که یعنی اختیاری
In یعنی Input و Out یعنی Output و Opt یعنی Optional، پارامتر ورودی، پارامتر خروجی و پارامتر اختیاری. جنبه راهنمایی داره، هم برای استفاده کننده و هم برای تحلیل کد.
Understanding SAL
وقتی پارامتری _In_ باشه انتظار داریم که فقط مقدار ورودی از فراخواننده دریافت کنه و نه مقدار ورودی رو تغییر بده و نه در هنگام بازگشت از متد چیزی داخلش بنویسه.
وقتی پارامتری _Out_ باشه انتظار داریم که مقدارش در هنگام فراخوانی متد اهمیتی نداشته باشه و صرفا موقع بازگشت از متد مقداری داخلش ثبت بشه تا فراخواننده ازش استفاده کنه. مثل out در پارامتر های #C ئه.
ترکیب In و Out مثل ref در پارامتر های #C ئه.
عملا همه پارامتر های Value Type ناگزیر Input هستند چون غیر از این نمیشه کاری باهاشون انجام داد، طبعا _Out_ برای پارامتری کاربرد داره که Reference Type باشه وگرنه تغییر پارامتر های Value Type عملا تاثیری در عملکرد فراخواننده نداره.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
ممنون استاد علی
یه پروژه ی کوچیک برای غیر فعال کردن سرویس آپدیت ویندوز نوشتم که در زیر آپلود میکنم ، اما انگار وقتی که سرویس آپدیت ویندوز ، هم بخش startup type اش بجز disable باشه (مثلا automatic باشه) و هم service status اش فعال شده باشه (start شده باشه) ، در این صورت پروژه را اجرا کنیم ، وقتی به قسمت زیر فقط میرسه:
کد:
this.Invoke(new ThreadStart(this.WinUpdateEventLog_MainThread));
و میخواد متد زیر را فراخونی کنه :
کد:
        private void WinUpdateServiceStop()
        {
            if (this.WinUpdateService.CanStop == true)
            {
                this.WinUpdateService.Stop();
            }
        }
ارور میده .
ولی این متد ، بجز در اون دلیگیت ، از جای دیگه هم فراخونی میشه (در متد سازنده) اما اونجا ارور نمیده
اما اگه تنظیمات سرویس آپدیت ویندوز ، روی بجز اون ترکیبی که گفتم باشه ، ارور نمیده
کد:
System.InvalidOperationException: 'Cannot stop wuauserv service on computer '.'.'


Win32Exception: The service has not been started
چرا؟ باید جی کار کرد؟
چرا ترکیب تنظیمات غیر از اون باشه مشکلی نداره؟ یا چرا در متد سازنده که اون متد فراخونی میشه ، ارور نمیده؟
 

پیوست ها

  • Windows Update Disabler.rar
    400.5 کیلوبایت · بازدیدها: 5

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام استاد علی . ممنون
خود فایل وقتی جداگانه اجرا میشه مشکل نداره
ولی وقتی با Installer Projects For Visual Studio 2017 برای این پروژه ستاپ ساختم ، بعد از نصب اجرا نمیشه . مشکل از این اینستالر هست؟
ستاپ را از این روش ساختم :
ایجاد فایل نصبی (Setup) برای برنامه در سی شارپ

کلا پس چجوری ستاپ بسازم؟
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
از Advanced Installer استفاده کردم و درست کار کرد ولی مشکلش اینه که چون .net framework را انتخاب کردم تا بصورت پیش فرض نصب کنه ، حجم را بسیار بالا برد (50 مگ کرد)
ولی نمیدونم با اونکه installer خود ویژال استودیو هم بصورت پیش فرض دات نت فریم وورک را برای پروژه در نظر گرفت ، ولی حجمش بسیار پایین بود (1.5 مگ بود)

--------------------------------------

بعد اینکه اگه بخوایم بعد از بالا اومدن ویندوز ، برنامه ای اجرا بشه (بجز دستکاری رجیستری) ، مگه نباید در پوشه ی استارت آپ در مسیر زیر ، یه میانبر درست کنیم؟ :


کد:
C:\Users\SomSaj\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

ولی واسه ی من چرا پس اجرا نمیشه موقع استارت آپ؟ (دسترسی administrator میخواد)
 

the_king

مدیرکل انجمن
از Advanced Installer استفاده کردم و درست کار کرد ولی مشکلش اینه که چون .net framework را انتخاب کردم تا بصورت پیش فرض نصب کنه ، حجم را بسیار بالا برد (50 مگ کرد)
ولی نمیدونم با اونکه installer خود ویژال استودیو هم بصورت پیش فرض دات نت فریم وورک را برای پروژه در نظر گرفت ، ولی حجمش بسیار پایین بود (1.5 مگ بود)

فرق Web Installer با Offline Installer همینه دیگه، مثل اون Setup های کم حجمی که از سایت مایکروسافت یا گوگل دانلود می کنید و DirectX و Visual C++ Redistributable و Google Chrome رو موقع نصب تازه دانلود می کنند.
بعد اینکه اگه بخوایم بعد از بالا اومدن ویندوز ، برنامه ای اجرا بشه (بجز دستکاری رجیستری) ، مگه نباید در پوشه ی استارت آپ در مسیر زیر ، یه میانبر درست کنیم؟ :

کد:
C:\Users\SomSaj\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

ولی واسه ی من چرا پس اجرا نمیشه موقع استارت آپ؟ (دسترسی administrator میخواد)
منظورتون اینه که Shortcut نمیسازه؟ یا Shortcut میسازه ولی چون در تنظیماتش تیک Run as Administrator نداره برنامه تون با دسترسی ادمین اجرا نمیشه؟
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
فرق Web Installer با Offline Installer همینه دیگه، مثل اون Setup های کم حجمی که از سایت مایکروسافت یا گوگل دانلود می کنید و DirectX و Visual C++ Redistributable و Google Chrome رو موقع نصب تازه دانلود می کنند.
ممنون استاد علی
الان متوجه نشدم . با همون Setup Installer خود ویژال استودیو (با همون روشی که لینکش را دادم) ، چرا کار نمیکنه؟ چی کار باید کرد؟ یا کلا ابزار یا نرم افزاری که خروجی ستاپ اش کم بشه ، هست؟


منظورتون اینه که Shortcut نمیسازه؟ یا Shortcut میسازه ولی چون در تنظیماتش تیک Run as Administrator نداره برنامه تون با دسترسی ادمین اجرا نمیشه؟

شورتکات میسازه .
اما برنامه موقع استارت آپ اجرا نمیشه (وقتی توی اون پوشه ی استارت آپ میذارم)

--------------------------------

جواب بقیه ی پست ها را هم میدین؟ مخصوصا پست 13 (این پست و دلیل ارورش برام مهمه)
و یه سئوال دیگه اینکه وقتی این پروژه فعاله ، خوب وقتی سرویس آپدیت ویندوز start بشه یا start type اش تغییر کنه ، برنامه هم stop میده سرویس را و هم disable اش میکنه (چون disable میکنه ، اصلا اجازه ی start شدن دیگه نداره و زمان start شدن هم هشدار میده) . اما یک بار که داشتم تست میکردم ، دیدم که start شد (که طبق روال نباید میشد) . نمیدونم شاید بخاطر اون قضیه ی ارور در پست 13 باشه یا نه؟ اما دفعات دیگه که تست کردم ، درست کار کرد
بعد هم یه بار سرویس svchost از اینترنت خیلی مصرف کرد . همون لحظه رفتم وضعیت سرویس windows update رو دیدم ، هم disable شده بود و هم stop داده شده بود . چیز دیگه ای غیر از سرویس windows update ، باعث میشه که سرویس svchost از اینترنت چیزی رو در حجم وسیع دانلود کنه؟
ممنون
 
آخرین ویرایش:

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
آها
انگار یه سرویس دیگه ای بنام Background Intelligent Transfer Service در دانلود آپدیت ویندوز نقش داره
درسته؟
اینم باید برای دانلود نکردن آپدیت ویندوز ، مسدود بشه دیگه؟
 

the_king

مدیرکل انجمن
ممنون استاد علی
الان متوجه نشدم . با همون Setup Installer خود ویژال استودیو (با همون روشی که لینکش را دادم) ، چرا کار نمیکنه؟ چی کار باید کرد؟ یا کلا ابزار یا نرم افزاری که خروجی ستاپ اش کم بشه ، هست؟
من که کار Setup Installer رو نمی تونم تحلیل کنم، اما ظاهر قضیه اینه که با دسترسی ادمین اجراش نمی کنه، برای دلیلش هم فقط میتونم حدس بزنم، فرضا حدس بزنم که شما یک فایل اجرایی در Setup دارید که بصورت مجزا از اون manifest اش داره اجرا میشه، فرضا در یک مسیر موقتی Temp یا هر مسیر دیگه ای بدون اینکه اون فایل manifest کنارش باشه اجرا میشه.

شورتکات میسازه .
اما برنامه موقع استارت آپ اجرا نمیشه (وقتی توی اون پوشه ی استارت آپ میذارم)

باید لینک و دسترسی ها رو بررسی اش کنید، چیزی نیست که من از راه دور بخوام نظر بدم. محض امتحان بجای برنامه خودتون برای یه فایل اجرایی عادی ویندوز مثل notepad.exe با کد نویسی shortcut سازی کنید.
جواب بقیه ی پست ها را هم میدین؟ مخصوصا پست 13 (این پست و دلیل ارورش برام مهمه)
بدون اینکه از جزئیات کار خبر داشته باشم چه پاسخی بدم؟ یک کاری می کنید جواب نمیده، به انواع دلایل مختلف ممکنه موفقیت آمیز نباشه. نه من پای سیستم شما هستم و نه از شرایط کار تون مطلع هستم.
پیغام خطا کاملا واضحه، میگه در حال اجرا نیست که بخواد متوقف اش کنه. مثل اینه که یک فایل رو دوبار حذف کنید، فقط دفعه اول کار می کنه، دفعه دوم خطا میده.

و یه سئوال دیگه اینکه وقتی این پروژه فعاله ، خوب وقتی سرویس آپدیت ویندوز start بشه یا start type اش تغییر کنه ، برنامه هم stop میده سرویس را و هم disable اش میکنه (چون disable میکنه ، اصلا اجازه ی start شدن دیگه نداره و زمان start شدن هم هشدار میده) . اما یک بار که داشتم تست میکردم ، دیدم که start شد (که طبق روال نباید میشد) . نمیدونم شاید بخاطر اون قضیه ی ارور در پست 13 باشه یا نه؟ اما دفعات دیگه که تست کردم ، درست کار کرد

به نحوه کار متد ها توجه کنید، بعضی متد ها Asynchronous اجرا میشن و بعضی ها Synchronous. متدی که Asynchronous اجرا بشه نخ رو معطل پایان فرایند نمیکنه، اجرا میره سراغ کد های بعدی در حالی که هنوز فرایند کامل نشده. شما درخواست اجرا شدن یا توقف اجرا سرویس رو میدید ولی زمانی که کد بعدی اجرا شد الزاما هنوز بسته شدن سرویس کارش تموم نشده. به متد Refresh هم توجه کنید، وضعیتی که از سرویس در Status یا پنجره سرویس ها می بینید وضعیتی ئه که نمایش داده شده، ممکنه بعد Refresh تغییر کنه.
بعد هم یه بار سرویس svchost از اینترنت خیلی مصرف کرد . همون لحظه رفتم وضعیت سرویس windows update رو دیدم ، هم disable شده بود و هم stop داده شده بود . چیز دیگه ای غیر از سرویس windows update ، باعث میشه که سرویس svchost از اینترنت چیزی رو در حجم وسیع دانلود کنه؟
ممنون
سوال تون قطعا مربوط به مشکلات ویندوز ئه، نه مباحث برنامه نویسی API یا #C
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سوال تون قطعا مربوط به مشکلات ویندوز ئه، نه مباحث برنامه نویسی API یا #C

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

جدیدترین ارسال ها

بالا