گفتگو هایی در باب سی شارپ

the_king

مدیرکل انجمن
کد رو این جوری تغییر دادم ولی باز هم زمان اجرا همون ارور را داد :

کد:
                VssVolumeSnapshotAttributes vssAttributes = (VssVolumeSnapshotAttributes.Persistent | VssVolumeSnapshotAttributes.ClientAccessible | VssVolumeSnapshotAttributes.NoAutoRelease | VssVolumeSnapshotAttributes.Differential | VssVolumeSnapshotAttributes.AutoRecover | ((VssVolumeSnapshotAttributes)13) );
                vssBackup.SetContext(vssAttributes);

اون عدد 13 هم مربوط به مقدار ClientAccessibleWriters در enum مربوط به VssSnapshotContext هست که پادویش هم این مقدار را ست کرده بود .
عدد 13 را هم به مقدار 0 تغییر دادم (مقدار مربوط به Backup در همون enum) و باز هم همون ارور را داد
شما یک زحمتی بکشید به من در مورد سه صفت VssVolumeSnapshotAttributes.ClientAccessible و VssVolumeSnapshotAttributes.Differential و VssVolumeSnapshotAttributes.AutoRecover توضیح بدید که کارشون چیه و تاثیرشون چیه و برای چه منظوری باید بکارشون ببرید.
 

the_king

مدیرکل انجمن
ممنون استاد علی
همونطور که در پست 956 (پست قبلی) کد دادم ، همین کاری که گفتید را انجام دادم ولی توی همون متد SetContext که میرسه ، همون ارور میده .
میگم ، میتونه مشکل از متد SetContext در رپر alphavss باشه؟

اصولا نه، خیلی بعیده. چون این خود alphavss که کاری انجام نمیده، به عنوان یک واسطه پارامتر ها رو ارسال می کنه به VSS. اگر خطایی رخ بده به احتمال زیاد مربوط به خود VSS ئه. مگر اینکه یک روال Validation ای داخل خود alphavss انجام میشه که اگر مقدار خارج از محدوده فلان بود معتبر نیست، که در اون صورت هم به احتمال زیاد درست میگه و شما مقدار معتبری بهش ندادید.

نمیشه این طور عمل کرد :
که متد SetContext را از api ویندوز اجرا کنیم و بقیه ی اعضا را از رپر alphavss .
نمیشه . درسته؟
نه. کلیه روال رو شما روی یک شیء از کلاس فلان مدیریت می کنید.

کلا احتمال بسیار زیاد میدم مشکل ها بابت متد SetContext هه . بازم احتمالا مشکل از این متد در رپر alphavss هه . راهنماش را که دقیق عمل کردم . نباید مشکل خاصی از نظر کدنویسی ام باشه .
نمیدونین حالا چه راهکاری میشه برای حل مشکل این متد SetContext در alphavss گرفت؟
واقعیتش من مطمئن نیستم. برای همین ازتون خواستم که در مورد صفاتی که بکار می برید توضیح بدید.
 

SajjadKhati

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


کد:
                VssVolumeSnapshotAttributes vssAttributes = ( VssVolumeSnapshotAttributes.NoAutoRelease | VssVolumeSnapshotAttributes.Differential | ((VssVolumeSnapshotAttributes)13));

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


کد:
            IVssImplementation vssImplementation = VssUtils.LoadImplementation();  // اولین کار ، شناسایی سیستم عامل و 32 بیتی یا 64 بیتی بودن اون برای شادو کپی هست که این تابع این کار را انجام میده
            using (IVssBackupComponents vssBackup = vssImplementation.CreateVssBackupComponents())   // دومین کار مهم ، ساختن شی ای از فرزندان اینترفیس IVssBackupComponents هست تا با شادو کپی بتونیم کار کنیم که این تابع این کار را انجام میده .)
            {
                vssBackup.InitializeForBackup(null);
                vssBackup.SetBackupState(false, false, VssBackupType.Full, false);  // پیکربندی کلی برای بکاپ

                vssBackup.GatherWriterMetadata();
                VssVolumeSnapshotAttributes vssAttributes = ( VssVolumeSnapshotAttributes.NoAutoRelease | VssVolumeSnapshotAttributes.Differential | ((VssVolumeSnapshotAttributes)13));  // اولا اون اتریباتس هایی که نوشته صریحا نباید توسط requester (منظورش برنامه نویس و توسعه دهنده ی vss هست) استفاده بشه را نباید استفاده کرد و دوما باید با یک مقدار از اینام VssSnapshotContext ، اور بشه . مقدار 13 ، اینام ای از VssSnapshotContext هست که برای نمایش در سربرگ previouse version به همراه بقیه ی اتریباتس ، لازم هست .
                vssBackup.SetContext(vssAttributes);
               
                string volumeName = "J:\\";
                Guid MyGuid_1 = vssBackup.StartSnapshotSet();
                Guid MyGuid_2 = vssBackup.AddToSnapshotSet(volumeName);  // برای اضافه کردن درایو برای شادو کپی (عملیات شادو کپی را انجام نمیده)
                vssBackup.PrepareForBackup();  // رویداد PrepareForBackup را برای نویسنده ی بکاپ ایجاد میکنه
                vssBackup.DoSnapshotSet();  // انجام عملیات شادو کپی ها در این set و مجموعه ، بصورت همزمان
            }

ویه سئوال اینکه پادویش این قابلیت را داره که از بکاپ هاش محاظفت کنه . یعنی وقتی در پنجره ی disk cleanup > more option در قسمت system restore and shadow copy بخوایم گزینه ی cleanup را بزنیم ، پادویش نمیذاره و ارور میده .
حالا به نظرتون پادویش این قابلیت را از همین vss api در ویندوز گرفت یا اینکه خودش جداگانه یه درایور یا کدی مجزا برای این کار نوشت؟
 

the_king

مدیرکل انجمن
یهوووو
الحمد الله .
خیلی ممنونم استاد عزیزم .
بالاخره خدا و حضرت ولی عضر (ارواحنا له الفدا) توسط راهنمایی های شما و پادویشی های عزیز ، این مشکل را حل کرد .
همونطور که قبلا هم اشاره کردم ، اون اتریباتس هایی که در توضیحات آخرش نوشته صریحا نباید توسط requester (منظورش برنامه نویس و توسعه دهنده ی vss هست) استفاده بشه را نباید استفاده کرد . بنابراین کد به شکل :
البته الان این رو میگید ولی تا اونجا که من در پست های قبلیتون میبینم ایراد رو در alphavss میدونستید نه کد خودتون.
بی علت در مورد اون سه صفت سوال نکردم، حتی اون VssVolumeSnapshotAttributes.Differential هم مناسب منظور شما نیست.
ویه سئوال اینکه پادویش این قابلیت را داره که از بکاپ هاش محاظفت کنه . یعنی وقتی در پنجره ی disk cleanup > more option در قسمت system restore and shadow copy بخوایم گزینه ی cleanup را بزنیم ، پادویش نمیذاره و ارور میده .
حالا به نظرتون پادویش این قابلیت را از همین vss api در ویندوز گرفت یا اینکه خودش جداگانه یه درایور یا کدی مجزا برای این کار نوشت؟
دسترسی ها بر اساس پروسه و کاربر قابل تنظیمه :
Security Considerations for Requesters - Windows applications
Security Considerations for Writers - Windows applications
و البته بهتره قبل از پریدن روی کد نویسیش یکم روی مطالعه محتوای چیزی که می نویسید وقت صرف کنید.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
کار خاصی نیست ولی عرض کردم که. محیط Unmanaged در حالت عادی کاری با delegate شما نمی تونه بکنه. delegate تون عملا بصورت یک اشاره گر ارسال میشه، مثل هر اشاره گر به متد دیگری در محیط Unmanaged :
کد:
        private delegate void SampleDelegate(int a);

        //[DllImport("user32.dll", EntryPoint = "GetWindowLongA")]
        //private static extern int GetWindowLong(IntPtr hwnd, int nIndex);

        [DllImport("user32.dll", EntryPoint = "GetWindowLongA")]
        private static extern int NewSample(SampleDelegate a, int nIndex);

        void Sample(int a)
        {
        }

        private void button1_Click(object sender, EventArgs e)
        {
            NewSample(new SampleDelegate(Sample), 0);
        }

ممنون استاد علی
من این متد Sample را متوجه نشدم دقیقا .
الان ورودی دلیگیت SampleDelegate ، نوع int میخواد دیگه . پس در کد زیر :


کد:
NewSample(new SampleDelegate(Sample), 0);

اولا متد Sample که خروجی اش void هه . دوما مگه متد نیست؟ پس چرا این متد را در کد بالا ، بصورت پروپرتی فراخونی کردین؟!!
کلا این خط یعنی قسمت Sample اش را متوجه نشدم .

بعد استاد علی ، این vss ها رویداد ندارن؟ حالا در alphavss خاصا . فقط انگار متد و پروپرتی دارن . توی سایت alphavss کلمه ی event را جستجو هم کردم ، رویدادی نیاورد .
مثلا رویداد زمان حذف بکاپ ها یا زمان ایجاد شون .
البته اینجور که دیدم ، انگار بعضی از همون متدها کار رویداد را انجام میدن .
 
آخرین ویرایش:

the_king

مدیرکل انجمن
ممنون استاد علی
من این متد Sample را متوجه نشدم دقیقا .
الان ورودی دلیگیت SampleDelegate ، نوع int میخواد دیگه . پس در کد زیر :
کد:
NewSample(new SampleDelegate(Sample), 0);
اولا متد Sample که خروجی اش void هه . دوما مگه متد نیست؟ پس چرا این متد را در کد بالا ، بصورت پروپرتی فراخونی کردین؟!!
کلا این خط یعنی قسمت Sample اش را متوجه نشدم .
خیر، ورودی سازنده delegate ئه SampleDelegate متدی است که با اون delegate سازگاره؛ int که متد نیست. به نظرتون (SampleDelegate(12 چطوری به Sample متصل شده؟ تشابه اسمی Sample و SampleDelegate که عامل تعیین کننده نیست. ممکنه شما هزار تا متد مثل Sample داشته باشید که تک پارامتر ورودی شون یک int باشه و خروجی شون void باشند، (SampleDelegate(12 هیچ ارتباطی با این متد ها نداره. شما 12 رو موقع اجرای یک متد لازم دارید نه موقع مشخص کردن خود متد. درسته که Sample خروجی اش void ئه، ولی ما که اینجا اصلا Sample رو اجرا نکردیم که خروجی ای در کار باشه، Sample اسم متد ئه، با اجرا کردنش مثل ()Sample و (12)Sample فرق داره. متدی که پارامتر اش رو بهش ندادید اجرا نمیشه که void برگردونه. مثال های ساده از delegate در #C رو ببینید، مثالی که قبلا هم تجربه کردید اجرا کردن Thread ئه. از بس سرسری از روی مباحث رد میشید هر چی که قبلا یادگرفتید هم به باد میدید. بخاطر بیارید که خودتون چطور از delegate ئه ParameterizedThreadStart استفاده می کردید :
گفتگو هایی در باب سی شارپ

بعد استاد علی ، این vss ها رویداد ندارن؟ حالا در alphavss خاصا . فقط انگار متد و پروپرتی دارن . توی سایت alphavss کلمه ی event را جستجو هم کردم ، رویدادی نیاورد .
مثلا رویداد زمان حذف بکاپ ها یا زمان ایجاد شون .
البته اینجور که دیدم ، انگار بعضی از همون متدها کار رویداد را انجام میدن .
تابعی به عنوان callback دارند. callback متدی است که شما طبق استاندارد از قبل مشخص شده در کدتون مینویسید که موقع رخداد خاصی اجرا خواهد شد ولی خودتون اجراش نمی کنید، اون روالی که از قبل مشخصه از این تابع callback استفاده می کنه و تابع رو بهش معرفی می کنید در زمان مشخص فراخوانیش می کنه.
معمولا روالی از callback استقاده می کنه که مستقل از نخ پروسه شما اجرا میشه و معلوم هم نیست چقدر اجراش طول میکشه. حتی شاید در داخل callback شما روال اجراش رو تغییر هم بدهید یا متوقف کنید چون متد callback ممکنه مقدار بازگشتی برای روال داشته باشه که روی روالش تاثیر بذاره.

در ++C و API ویندوز این متد های callback مرسومه. موقع اجرای روالی که از callback استفاده می کنه، یک تابعی رو در کد خودتون به عنوان callback معرفی می کنید و اجرای اون عملیات مستقل از اجرای کدتون شروع میشه. وقتی کار روال به اتمام رسید یا رخداد مربوط به اون تابع اتفاق افتاد اون تابع callback شما اجرا میشه. یعنی همون رخداد ئه که توسط تابع های callback اجرا میشه.
IVssBackupComponents.BeginDoSnapshotSet Method
در عملیات هایی مثل گرفتن لیست فونت های ویندوز هم همین callback ها رو داریم :
EnumFontFamiliesExA function
 

SU-57

Active Member
سلام

استاد علی کد زیر رو در نظر بگیرید

کد:
MessageBox.Show(item.GetType().Name);

1- GetType() یک متد هست. آیا اون Name هم یک متده یا یک خاصیت
2- یک توضیح مختصر درباره اولویت اجرای کد زیر بدید. منظورم اینه که چون 2 تا عملگر نقطه اومده، کد مورد نظر از راست به چپ اجرا می شه یا از چپ به راست
کد:
item.GetType().Name

3- کد زیر:

کد:
MessageBox.Show();

یک کتاب آموزش سی شارپ گرفتم نوشته MessageBox یک کلاسه و Show یک متده. اما به مجموع MessageBox.Show میگه تابع در حالی که در MSDN نوشته متد. بالاخره تابع هست یا متد و تفاوتشون چیه؟ اگه اینا یکیشون کلاسه (MessageBox) و یکیشون متد(Show) چطوری مجموعا متد در نظر گرفته میشن.

همچنین به مجموع GetType().Name چی باید بگیم؟
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام

استاد علی کد زیر رو در نظر بگیرید

کد:
MessageBox.Show(item.GetType().Name);

1- GetType() یک متد هست. آیا اون Name هم یک متده یا یک خاصیت
2- یک توضیح مختصر درباره اولویت اجرای کد زیر بدید. منظورم اینه که چون 2 تا عملگر نقطه اومده، کد مورد نظر از راست به چپ اجرا می شه یا از چپ به راست
کد:
item.GetType().Name

3- کد زیر:

کد:
MessageBox.Show();

یک کتاب آموزش سی شارپ گرفتم نوشته MessageBox یک کلاسه و Show یک متده. اما به مجموع MessageBox.Show میگه تابع در حالی که در MSDN نوشته متد. بالاخره تابع هست یا متد و تفاوتشون چیه؟ اگه اینا یکیشون کلاسه (MessageBox) و یکیشون متد(Show) چطوری مجموعا متد در نظر گرفته میشن.

همچنین به مجموع GetType().Name چی باید بگیم؟

سلام آقا رامین
1) Name یک خاصیت هه .
2) هر چند تا نقطه بیاد ، همه از چپ به راست اجرا میشه یعنی اول خروجی item.GetType() اجرا میشه و بعد خروجی item.GetType().Name
3) درست گفته . متد ، همون تابع هست . مجموعا متد در نظر گرفته میشن چون آخرین عضو که نوشته میشه ، مورد نظر هست . یعنی مثلا


کد:
item.GetType()

یک تابع یا متد هست چون عضو آخر یعنی GetType() مد نظر هست . اما

کد:
item.GetType().Name
یک پروپرتی هست چون باز هم عضو آخر یعنی Name مد نظر هست
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
البته الان این رو میگید ولی تا اونجا که من در پست های قبلیتون میبینم ایراد رو در alphavss میدونستید نه کد خودتون.
بی علت در مورد اون سه صفت سوال نکردم، حتی اون VssVolumeSnapshotAttributes.Differential هم مناسب منظور شما نیست.

سلامی مجدد
بله فکر میکردم مشکل از alphavss و خاصا متد SetContext شه . البته قطعی که نگفتم . گفتم احتمالا :)
البته توی alphavss هم مثل vss api ، بهتر میبود تا نوع عدد گرفته میشد تا نوه enum یا اورلود دیگه ای واسه ی اون متد SetContext درست میکردن که دو تا اینام ها را براش ترکیب میکردن .
حالا این جوری هم مشکلات خودش را داره .


خیر، ورودی سازنده delegate ئه SampleDelegate متدی است که با اون delegate سازگاره؛ int که متد نیست. به نظرتون (SampleDelegate(12 چطوری به Sample متصل شده؟ تشابه اسمی Sample و SampleDelegate که عامل تعیین کننده نیست. ممکنه شما هزار تا متد مثل Sample داشته باشید که تک پارامتر ورودی شون یک int باشه و خروجی شون void باشند، (SampleDelegate(12 هیچ ارتباطی با این متد ها نداره. شما 12 رو موقع اجرای یک متد لازم دارید نه موقع مشخص کردن خود متد. درسته که Sample خروجی اش void ئه، ولی ما که اینجا اصلا Sample رو اجرا نکردیم که خروجی ای در کار باشه، Sample اسم متد ئه، با اجرا کردنش مثل ()Sample و (12)Sample فرق داره. متدی که پارامتر اش رو بهش ندادید اجرا نمیشه که void برگردونه. مثال های ساده از delegate در #C رو ببینید، مثالی که قبلا هم تجربه کردید اجرا کردن Thread ئه. از بس سرسری از روی مباحث رد میشید هر چی که قبلا یادگرفتید هم به باد میدید. بخاطر بیارید که خودتون چطور از delegate ئه ParameterizedThreadStart استفاده می کردید :
گفتگو هایی در باب سی شارپ

وای . این چه سئوالی بود من پرسیدم . از خجالت دارم آب میشم :green: این سئوال بود من پرسیدم؟!! نمیدونم چرا گاها حواسم به این مسائل پیش و پا افتاده نیست .
ببخشید استاد علی . بله مبحث دلیگیت را میدونم . یه لحظه قات زدم .

ولی اگه ارسال یه متد به زبان های unmanaged این طور باشه ، پس این که عین کد سی شارپ هست . یعنی در زبان های managed این طور کد نویسی میشه . مگه ارسال از طریق زبان های managed به unmanaged فرقی نمیکنه؟


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

در ++C و API ویندوز این متد های callback مرسومه. موقع اجرای روالی که از callback استفاده می کنه، یک تابعی رو در کد خودتون به عنوان callback معرفی می کنید و اجرای اون عملیات مستقل از اجرای کدتون شروع میشه. وقتی کار روال به اتمام رسید یا رخداد مربوط به اون تابع اتفاق افتاد اون تابع callback شما اجرا میشه. یعنی همون رخداد ئه که توسط تابع های callback اجرا میشه.
IVssBackupComponents.BeginDoSnapshotSet Method
در عملیات هایی مثل گرفتن لیست فونت های ویندوز هم همین callback ها رو داریم :
EnumFontFamiliesExA function

ممنون ازتون
الان هر متدی که با Begin شروع شد مثل همین متد BeginDoSnapshotSet ، متد callback هستن یا هر متدی که توی پارامترش نوع AsyncCallback دارن؟
یه کم بیشتر توضیح میدین از کجا متوجه ی نوع متد callback میشین و ...؟
 
آخرین ویرایش:

the_king

مدیرکل انجمن
ولی اگه ارسال یه متد به زبان های unmanaged این طور باشه ، پس این که عین کد سی شارپ هست . یعنی در زبان های managed این طور کد نویسی میشه . مگه ارسال از طریق زبان های managed به unmanaged فرقی نمیکنه؟
تفاوت زبان ها سرجاشه، چیزی که شما ارسال می کنید فقط و فقط یک اشاره گر ئه، یک آدرس حافظه. یعنی یک داده 32 بیتی یا 64 بیتی که فرقی هم نمی کنه کامپایلر مبدا و مقصد از چه زبانی باشند. گیرنده ممکنه هیچ درکی از اون متد و پارامتر هاش نداشته باشه، چطور که مثالی که من زدم هم همینطوره، ولی به هر حال کامپایلر دلیلی نمی بینه که برای تلاش شما برای ارسال آدرس متد Sample به محیط Unmanaged مانعی ایجاد کنه. این شما هستید که باید بدانید اون آدرس رو برای چه منظوری ارسال می کنید و میدانید که بدرد GetWindowLongA نخواهد خورد، اما کامپایلر که اینو نمیدونه. برایش هم فرقی نمی کنه و ارسال آدرس تابع به عنوان یک IntPtr هیچ زحمتی نداره.
شما دارید یک آدرس حافظه رو ارسال می کنید، اختصاصی زبان خاصی نیست که تفاوت زبان ها مساله ساز باشه.
الان هر متدی که با Begin شروع شد مثل همین متد BeginDoSnapshotSet ، متد callback هستن یا هر متدی که توی پارامترش نوع AsyncCallback دارن؟
یه کم بیشتر توضیح میدین از کجا متوجه ی نوع متد callback میشین و ...؟
اینجوری قاعده بندی نکنید، به نامش کاری نداشته باشید. هر جا صحبت callback باشه هم در توضیحات میاد و هم متد callback کاملا توصیف و تعریف میشه. چون غیر از این باشه نمیتوانید برایش کد نویسی کنید.
یعنی سه تا شرط کاملا بدیهی داره. اولی اینکه خیلی واضح در توضیحات پارامتر نوشته شده باشه این پارامتر آدرس یک تابع callback ئه و شرط دوم که اونم بدیهیه اینه که اون پارامتر از نوع آدرس یک متد تعریف شده است، یعنی فرضا پارامتر از نوع داده اعشاری یا char نیست. شرط سوم اینه که شما نمی توانید متد callback ای بنویسید وقتی ندونید اون متد callback چه پارامتر هایی داره و چه مقداری برمیگردونه. پس حتما در توضیحات به این موارد اشاره شده که این پارامتر از نوع آدرس متد FINISH ئه (در ++C/C یک کاراکتر ستاره قبل از اسم متد نوشته میشه که مشخص بشه اشاره گره) که FINISH تعریفش فلانطوره.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
تفاوت زبان ها سرجاشه، چیزی که شما ارسال می کنید فقط و فقط یک اشاره گر ئه، یک آدرس حافظه. یعنی یک داده 32 بیتی یا 64 بیتی که فرقی هم نمی کنه کامپایلر مبدا و مقصد از چه زبانی باشند. گیرنده ممکنه هیچ درکی از اون متد و پارامتر هاش نداشته باشه، چطور که مثالی که من زدم هم همینطوره، ولی به هر حال کامپایلر دلیلی نمی بینه که برای تلاش شما برای ارسال آدرس متد Sample به محیط Unmanaged مانعی ایجاد کنه. این شما هستید که باید بدانید اون آدرس رو برای چه منظوری ارسال می کنید و میدانید که بدرد GetWindowLongA نخواهد خورد، اما کامپایلر که اینو نمیدونه. برایش هم فرقی نمی کنه و ارسال آدرس تابع به عنوان یک IntPtr هیچ زحمتی نداره.
شما دارید یک آدرس حافظه رو ارسال می کنید، اختصاصی زبان خاصی نیست که تفاوت زبان ها مساله ساز باشه.
خیلی ممنون
پس اگه اشتباه نکنم ، هر نوع شی ای از هر کلاسی بدیم ، چون اشاره گر هستن ، DllImport ، اتوماتیک موقع خروجی اونها را به نوع IntPtr تبدیل میکنه و بعد ارسال میکنه . درسته؟


اینجوری قاعده بندی نکنید، به نامش کاری نداشته باشید. هر جا صحبت callback باشه هم در توضیحات میاد و هم متد callback کاملا توصیف و تعریف میشه. چون غیر از این باشه نمیتوانید برایش کد نویسی کنید.
یعنی سه تا شرط کاملا بدیهی داره. اولی اینکه خیلی واضح در توضیحات پارامتر نوشته شده باشه این پارامتر آدرس یک تابع callback ئه و شرط دوم که اونم بدیهیه اینه که اون پارامتر از نوع آدرس یک متد تعریف شده است، یعنی فرضا پارامتر از نوع داده اعشاری یا char نیست. شرط سوم اینه که شما نمی توانید متد callback ای بنویسید وقتی ندونید اون متد callback چه پارامتر هایی داره و چه مقداری برمیگردونه. پس حتما در توضیحات به این موارد اشاره شده که این پارامتر از نوع آدرس متد FINISH ئه (در ++C/C یک کاراکتر ستاره قبل از اسم متد نوشته میشه که مشخص بشه اشاره گره) که FINISH تعریفش فلانطوره.
ممنون
 

the_king

مدیرکل انجمن
خیلی ممنون
پس اگه اشتباه نکنم ، هر نوع شی ای از هر کلاسی بدیم ، چون اشاره گر هستن ، DllImport ، اتوماتیک موقع خروجی اونها را به نوع IntPtr تبدیل میکنه و بعد ارسال میکنه . درسته؟



ممنون
نه دقیقا، شما که میدونید IntPtr خودش یک struct ئه. طبیعتا ارسال داده struct به پارامتر خودش نیاز به اشاره گر داره. پس اون تبدیلی که صورت میگیره نمیتونه خروجی اش IntPtr بوده باشه.
IntPtr یک ساختار داده ای در #C ئه که معادل اشاره گر ها در محیط Unmanaged ئه. درسته که IntPtr رو در #C جایگزین اشاره گر بکار می بریم اما این برای داخل محیط #C کاربرد داره، وقتی قراره با خارج از محیط ارتباط برقرار بشه به داده عددی معادلش تبدیل میشه. اما اگه منظورتون از IntPtr اشاره گر و آدرس شیء باشه بله تبدیل به شیوه ای که بصورت پیشفرض برای Marshal شدن تعیین شده صورت میگیره. می توانید در مورد MarshalAs تحقیق کنید.
 

SU-57

Active Member
سلام

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

کد:
object number1 = 10;

MessageBox.Show(number1.GetType().Name);


جواب Int32 هستش یعنی نوع سمت راست مساوی رو بر می گردونه. پس اینجا نمیاد نوع رو از سمت چپ بگیره بلکه نوع مقدار متغیر number1 رو در نظر می گیره که 10 هست. بنابراین نوع رو Int32 می دونه نه object.

حالا من کد زیر رو می نویسم
کد:
object number1 = 10;
     
if (number1 is object)

    MessageBox.Show(number1.ToString());
حالا نوع رو object تشخیص میده. :?:
 
آخرین ویرایش:

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام

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

کد:
object number1 = 10;

MessageBox.Show(number1.GetType().Name);


جواب Int32 هستش یعنی نوع سمت راست مساوی رو بر می گردونه. پس اینجا نمیاد نوع رو از سمت چپ بگیره بلکه نوع مقدار متغیر number1 رو در نظر می گیره که 10 هست. بنابراین نوع رو Int32 می دونه نه object.

حالا من کد زیر رو می نویسم
کد:
object number1 = 10;
  
if (number1 is object)

    MessageBox.Show(number1.ToString());
حالا نوع رو object تشخیص میده. :?:

سلام
نوع متغییر (بصورت عمومی) ، سمت چپ مساوی هست .
اون متد gettype ، نوعِ شی را میگیره .
البته در واقع وقتی این متد gettype ، نوعِ شی را بگیره ، در واقع نوع متغییر را هم در خودش خواهد داشت . یه کم درکش سخت هه چون نیاز به مباحث شی گرایی داره . استاد علی در اینجا کامل توضیح دادن :

گفتگو هایی در باب سی شارپ
 

the_king

مدیرکل انجمن
سلام

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

کد:
object number1 = 10;

MessageBox.Show(number1.GetType().Name);


جواب Int32 هستش یعنی نوع سمت راست مساوی رو بر می گردونه. پس اینجا نمیاد نوع رو از سمت چپ بگیره بلکه نوع مقدار متغیر number1 رو در نظر می گیره که 10 هست. بنابراین نوع رو Int32 می دونه نه object.

حالا من کد زیر رو می نویسم
کد:
object number1 = 10;
    
if (number1 is object)

    MessageBox.Show(number1.ToString());
حالا نوع رو object تشخیص میده. :?:
دو تا مساله رو به یاد بسپارید.
اول اینکه object یک محفظه است، نوع داده ای است که یک محفظه ایجاد می کنه و هر نوع داده ای میتونه داخلش قرار بگیره، هر نوع. برای همینه که می توانید هر نوع داده ای رو به راحتی به object تبدیل کنید و داخل متغیری از نوع object قرار بدید. یعنی هیچ نوع داده ای در #C نیست که داخل یک object نشه قرار داد یا باهاش سازگار نباشه. و نوع داده داخل محفظه object هم حفظ میشه، تبدیل به object نمیشه. بنابر این، اینکه شما یک متغیر از نوع object داشته باشید و مقدار int ای داخلش قرار بدید مثل اینه که میوه رو داخل کیسه نایلونی قرار بدید. هر زمان از داخل کیسه خارجش کنید همون فرمت و نوع داده اصلیش رو حفظ کرده.
مورد دوم مفهوم is ئه. is سازگاری مقدار متغیر رو با یک نوع خاص داده چک می کنه. یعنی number1 is object بررسی می کنه که آیا مقدار داخل number1 با نوع داده object سازگار هست یا خیر.
لازم نیست که حتما مقدار داخلش object باشه، میتونه int باشه، Button باشه و ... مهم اینه که با object سازگار باشه که اینطور هم هست. همه انواع داده ای با object سازگارند. اما اگر داخل number1 مقدار null قرار بدید دیگه number1 is object درست نیست چون null یعنی هیچی. مقداری نداره که object محسوب بشه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
دسترسی ها بر اساس پروسه و کاربر قابل تنظیمه :
Security Considerations for Requesters - Windows applications
Security Considerations for Writers - Windows applications
و البته بهتره قبل از پریدن روی کد نویسیش یکم روی مطالعه محتوای چیزی که می نویسید وقت صرف کنید.

سلامی مجدد بر استاد علی
خیلی ممنونم
من لینک اولی را خوندم (که بیشترا رو متوجه نشدم چی میگه) ولی کلیاتی که گفتش را در زیر میگم حالا دقیق نمیدونم چه ربطی به این قضیه ی منع دسترسی به بکاپ ها داره .
در بخش دوم اومد گفت برای مدیریت خطا و اینکه نرم افزار بکاپ تون که با ارورهای مهم رو به رو میشه ، کرش نکنه ، در اینجا

IGlobalOptions::Set

IGlobalOptions

پروپرتی COMGLB_EXCEPTION_HANDLING را به مقدار COMGLB_EXCEPTION_DONOT_HANDLE تغییر بدین .
توی بخش سوم (مجوز دسترسی کمپوننت پیش فرض نرم افزار بکاپی که مینویسیم) گفت که برای حل این مشکل (که در پاراگراف سوم از بخش سوم نوشته) (خودمم متوجه نشدم در پاراگراف های بالاتر ، چه مشکلی را میگه) هر پروسس سرور کمپوننت (COM server) (خودمم نمیدونم COM server و COM client چی هستن ولی همون اول توضیح داد که نرم افزارهای بکاپ (requester) میتونن به عنوان COM server و COM client عمل کنن) میتونه کنترل بیشتری روی این کنه که آیا یک COM client (من اینجا فرض میکنم که منظورش از COM client ، هر برنامه ای هه که میخواد با vss api ها و کلا vss ها کار کنه و مثلا بکاپ ها را حذف کنه . حالا نمیدونم تعبیرم درسته یا نه) یا RPC (که نمیدونم چیه) ، اجازه داره تا متدهای COM (باز هم همون متدهای مربوط به حذف کردن بکاپ رو از کمپوننت vss در نظر میگیرم) را اجرا کنه که توسط سرور (توی پرانتز گفت مثلا requester ها که نرم افزارهای بکاپ هستن) پیاده سازی شدن با استفاده از تابع CoInitializeSecurity :

CoInitializeSecurity function

خوب الان کلا منظورش اینه که با این متد CoInitializeSecurity ، میتونیم دسترسی به بکاپ vss ای که گرفتیم را توسط هر پروسس دیگه یا هر اکنت دیگه ای که میخواد انجام بشه ، مسدود کنیم؟
اگه این طوره ، خوب یه نفر ، یه اپلیکیشن دیگه میسازه که اپلیکیشن و پروسه ی ما را هم به بکاپ توسط این متد مسدود کنه و ما نتونیم نه بکاپ بگیریم و نه از بکاپ هایی که گرفته بودیم ، محافظت کنیم و بعدش هم خودش بکاپ های ما را حذف کنه .

الان این برداشتی که کردم ، در کل درسته؟
کلا باید با همین متد CoInitializeSecurity برای مسدود کردن دسترسی ها به بکاپ ، اقدام کرد؟


دو تا مورد جدا رو قاطی نکنید، مورد اول اینه که یک پارامتری به ساختاری از نوع فلان اشاره کنه که اون فلان یک اینترفیس یا struct یا نوع داده مشخصیه و مورد دوم مدیریت حافظه ای است که Unmanaged ئه و می خواهید از داخل کد #C باهاش کار کنید. Marshal کاری با مورد اول نداره، Marshal به شما امکان میده که ارتباط میان محیط Managed و Unmanaged رو برقرار کنید، مورد دوم.
اون Marshal در خیلی موارد قابل استفاده است، اما در مورد اون struct ها هم شما برای ارجاع به struct از Marshal استفاده نکردید. از Marshal برای مدیریت حافظه استفاده کردید نه ارجاع به struct.
شما در ویژوال استدیو میتوانید ساختار اون اینترفیس هایی که Wrapper یا Type Library داخل کمپوننت ها تعریف کرده رو ببینید، به سادگی بهشون رفرنس داده میشه، اینکار Marshal لازم نداره. #C که برای ارجاع دادن به ساختاری که براش تعریف بشه مشکلی نداره. اما وقتی صحبت تعامل بین حافظه مدیریت شده و نشده میشه گاهی اوقات لازمه از Marshal کمک بگیرید، گاهی اوقات، چون در مواردی بصورت خودکار خود همون DllImport یکسری تعاملات رو انجام میده، اگر انجام نمیداد که نمی توانستید به سادگی پارامتر به متد خارجی بفرستید و دریافت کنید.

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

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
بعد هم اینکه ما یه فایل هدر داریم . مثلا در متد زیر :

IVssBackupComponents::DeleteSnapshots

که از هدر vsbackup.h استفاده میکنه ، چجوری میشه مقدار ثابت های هدر ها را در ویژال استودیو دید؟ یا فقط میشه مقادیرهاشو باید از اینترنت جستجو کرد؟

و هم اینکه مثالی از این اینترفیس برای همین لینک بالا میزنین که چطور میشه این متد که در اون اینترفیس unmanaged هست را فراخونی کرد؟
 
آخرین ویرایش:

the_king

مدیرکل انجمن
خوب الان کلا منظورش اینه که با این متد CoInitializeSecurity ، میتونیم دسترسی به بکاپ vss ای که گرفتیم را توسط هر پروسس دیگه یا هر اکنت دیگه ای که میخواد انجام بشه ، مسدود کنیم؟

نه فقط اون، کاملتر از اون، CoInitializeSecurity نه جزئی از VSS ئه و نه خودش کاری با VSS داره، جزئی از COM ئه. هر پروسه ای که به عنوان سرور یا کلاینت با COM کار می کنه با این تابع برای پروسه اش سطح دسترسی و امنیت اش رو مشخص می کنه. هر درخواستی که از رابط COM صورت بگیره باید در دسترسی های مشخص شده پروسه بگنجه وگرنه رد میشه. چون شناختی ازش ندارید براتون پیچیده است اما اساس دسترسی های پروسه ها به COM رو مشخص می کنه.

اگه این طوره ، خوب یه نفر ، یه اپلیکیشن دیگه میسازه که اپلیکیشن و پروسه ی ما را هم به بکاپ توسط این متد مسدود کنه و ما نتونیم نه بکاپ بگیریم و نه از بکاپ هایی که گرفته بودیم ، محافظت کنیم و بعدش هم خودش بکاپ های ما را حذف کنه .
درخواستی که گیرنده اش پروسه شما هستید که توسط پروسه دیگری دریافت نمیشه. درخواستی به اون اپلیکیشن و پروسه اش ارسال نمیشه که رد کردن و نکردنش فرقی به حال شما کنه. درخواست به سمت پروسه شما میاد چون به requestor یا writer شما مربوطه و با آنها کار دارند. طبعا برای backup ای که ربطی به requestor یا writer شما نداره هم که به پروسه شما درخواست داده نمیشه.
همانطور که برای درخواستی که مربوط به پروسه شما است هیچ پروسه دیگری درخواست دریافت نمی کنه که بخواد دخالت کنه و بجای شما رد یا تایید کنه.

الان این برداشتی که کردم ، در کل درسته؟
برداشت کلی تون رو متوجه نشدم.
کلا باید با همین متد CoInitializeSecurity برای مسدود کردن دسترسی ها به بکاپ ، اقدام کرد؟

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

یه مثال برای ایترفیس ها میزنین؟
یعنی یه اینترفیس سی پلاس پلاس و unmanaged (ترجیحا یکی از اینترفیس های api ویندوز باشه که هم متد توش باشه و هم یه پروپرتی) مثال میزنین که چجوری از توی سی شارپ و اینترفیس های سی شارپ میشه با اون ارتباط برقرار کرد و شی اینترفیس سی شارپ را براش ارسال کرد؟
شما می توانید از اینترفیس شیء بسازید؟ یعنی فرضا از IList یک شیء بسازید؟ و اصلا تصور کنید که شعبده بازی کردید و از چیزی که پیاده سازی نداره شیء ساختید، اون شیء به چه کار محیط Unmanaged میاد که بهش ارسال بشه؟
 

the_king

مدیرکل انجمن
بعد هم اینکه ما یه فایل هدر داریم . مثلا در متد زیر :

IVssBackupComponents::DeleteSnapshots

که از هدر vsbackup.h استفاده میکنه ، چجوری میشه مقدار ثابت های هدر ها را در ویژال استودیو دید؟ یا فقط میشه مقادیرهاشو باید از اینترنت جستجو کرد؟
الزاما ربطی به خود Visual Studio نداره، جزو Windows SDK ئه. اگر Windows SDK یکی از ویندوز ها رو از سایت مایکروسافت بصورت کامل دانلود کنید (معمولا یک فایل iso) مجموعه کاملی از این header ها هم داخلش هست. برای برنامه نویس های زبان ++C/C اصولا نیازی به دیدن مقادیر ثابت ها یا جستجو شون نیست، چون یکباره کل header رو در کدشون مرجع قرار می دهند و فقط از همون اسم مقادیر استفاده می کنند.
و هم اینکه مثالی از این اینترفیس برای همین لینک بالا میزنین که چطور میشه این متد که در اون اینترفیس unmanaged هست را فراخونی کرد؟
اون متد رو برای کدوم شیء فراخوانی کنیم؟ شما که شیء ای که اون متد رو پیاده سازی کرده رو ندارید که متد رو برایش فراخوانی کنید.
برای همینه که از alphavss استفاده می کنید که نقش Wrapper رو داشته باشه و شی در اختیارشه و میتونه متد اش رو هم فراخوانی کنه.
 

SajjadKhati

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


درخواستی که گیرنده اش پروسه شما هستید که توسط پروسه دیگری دریافت نمیشه. درخواستی به اون اپلیکیشن و پروسه اش ارسال نمیشه که رد کردن و نکردنش فرقی به حال شما کنه. درخواست به سمت پروسه شما میاد چون به requestor یا writer شما مربوطه و با آنها کار دارند. طبعا برای backup ای که ربطی به requestor یا writer شما نداره هم که به پروسه شما درخواست داده نمیشه.
همانطور که برای درخواستی که مربوط به پروسه شما است هیچ پروسه دیگری درخواست دریافت نمی کنه که بخواد دخالت کنه و بجای شما رد یا تایید کنه.


برداشت کلی تون رو متوجه نشدم.

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

ممنون استاد علی
الان منظورتون اینه که هر بکاپی که گرفته شد ، درخواست ها (مثل فراخونی توابع مربوط به vss) فقط به پروسه ( requester و writer) اش جواب میده و غیر از اونها ، جواب نمیده؟
که فکر نکنم منظورتون این باشه و من اشتباه برداشت میکنم . چون هر کس با همون متد Delete

IVssBackupComponents::DeleteSnapshots

یا با دستور vssadmin delete shadows all در command line ، میتونه همه ی بکاپ هایی که هر پروسه و requester ای گرفت را حذف کنه .
کلا قشنگ منظورتونو متوجه نشدم

شما می توانید از اینترفیس شیء بسازید؟ یعنی فرضا از IList یک شیء بسازید؟ و اصلا تصور کنید که شعبده بازی کردید و از چیزی که پیاده سازی نداره شیء ساختید، اون شیء به چه کار محیط Unmanaged میاد که بهش ارسال بشه؟

اون متد رو برای کدوم شیء فراخوانی کنیم؟ شما که شیء ای که اون متد رو پیاده سازی کرده رو ندارید که متد رو برایش فراخوانی کنید.
برای همینه که از alphavss استفاده می کنید که نقش Wrapper رو داشته باشه و شی در اختیارشه و میتونه متد اش رو هم فراخوانی کنه.

بله . منظور من هم همین بود . اینکه چجوری میشه مشتقات اینترفیس IVssBackupComponents را (در api) پیدا کرد و هم اینکه مثلا در اون wrapper alphavss چه کدی نوشتن که با این متد میتونه توسط سی شارپ ارتباط برقرار کنه؟ و کلا اگه میشد یه مثالی از فراخونی این متد در این اینترفیس توسط سی شارپ بزنین ، عالی میشد .
ممنون
 

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

بالا