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

the_king

مدیرکل انجمن
مثلا وقتی ما می تونیم یک کنترل رو از Toolbox با کشیدن وارد فرم کنیم و خاصیت هاش رو تنظیم کنیم چه نیازی هست که تو محیط کد، دستی اینکار رو انجام بدیم؟
دو تا مساله رو در نظر بگیرید، اول اینکه همون کاری که شما با کشیدن کنترل روی فرم و تنظیمات مشخصه ها در Designer ئه ویژوال استدیو انجام میدید تبدیل به کد برنامه میشه. یعنی درسته که شما ظاهرا خودتون کدی ننوشتید، ولی نهایتا شما دارید با کمک Designer کد رو بصورت خودکار و به روش ساده تری تولید می کنید و البته می توانید بعدا حتی اون کد خودکار تولید شده رو ببینید و تغییر بدهید.
دومین مساله اینه که اینطور نیست که همیشه از قبل همه اجزائی که روی فرم قرار میگیره مشخص باشه. گاهی لازمه شما بر اساس نیاز کاربر موردی رو به تعداد دلخواه و در موقعیتی که کاربر میخواد نمایش بدید. مثل کاری که Firefox و Chrome انجام میدن تا کاربر Browser اش رو Customize کنه. یعنی خودش تصمیم بگیره چه اجزائی و در کجای پنجره Browser نمایش داده بشه. این چیزی نیست که Designer ویژوال استدیو بتونه براتون پیاده سازی کنه چون وقتی شما فرم رو طراحی می کنید که کاربر نهایی هنوز از برنامه استفاده نکرده و نمیدونید بجایش تصمیم بگیرید، اینجا مثالی است که باید از کد نویسی دستی برای ساختن اجزاء روی فرم استفاده کنید.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام مجدد به استاد علی و آقا سجاد

آقا سجاد آخر قسمت 16 خیلی سخت بود. من تقریبا چیزی متوجه نشدم. البته شما کامل توضیح دادی ولی من چون برنامه نویسی کار نکردم متوجه نشدم و مشکل از منه. خوب شما هم اشاره کردی که باید به مبحث کلاس ها برسم تا متوجه بشم ولی من یکسری سوال برام پیش اومد فعلا می پرسم و نمی تونم تا مبحث کلاس صبر کنم باید همین الان متوجه بشم.


الان من می خوام متن btn1 و Button1 با MesssageBox نشون داده بشن لطف می کنی این کد رو درست کنی. (حالا کاربردش رو هم متوجه نشدم که مثلا اگه با MessageBox اینا رو نمایش بدیم چه سودی داره)

کد:
Button myButton = new Button();

            myButton.Name = "btn1";
            myButton.Text = "Button1";


نکته بعدی اینکه الان myButton یک متغیری از نوع Button هست یا از نوع کلاس Button

سلام آقا رامین
کجاشو متوجه نشدین؟ از اون بخش سئوال بپرسین.
بفرمایید :


کد:
            Button myButton = new Button();
            myButton.Name = "btn1";
            myButton.Text = "Button1";

            MessageBox.Show(myButton.Name);

تابع MessageBox.Show رشته میگیره و همونطور که میدونید myButton.Name و myButton.Text رشته هستن که میتونید توی ورودی اون تابع بدید .
سود خاصی نداره ولی من ترجیح دادم اوایل کار چون درگیر حاشیه و شی گرایی نشم و برای طرف مقابل درکش سخت نشه ، برای نمایش کدها از تابع MessageBox.Show استفاده کنم (که البته تا آخر آموزش هم ادامه پیدا کرد) . میشه پیام ها را مثلا توی شی textbox و هر شی دیگه ای (در پروپرتی text شون) هم نمایش داد .
نوع رو در واقع همون کلاس بدونید . وقتی میگیم شی ای (در اینجا منظورم متغییر هست) از نوع Button هست ، در واقع یعنی همونکه شی ای از نوع کلاس Button هست

اون سئوال را هم که استاد علی جواب دادن .
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
بله. در سایت مایکروسافت در مورد اغلب متد ها بر اساس دو گروه سرور و غیر سرور (کلاینت) پشتیبانی مشخص میشه، فرضا :
GetWindowLongA function
و فرض نکنید که چون فلان متد یا کلاس پشتیبانی نشد در مورد سایر کلاس ها و متد ها هم شرایط مشابهه. دونه به دونه شون ممکنه شرایط پشتیبانی متفاوتی داشته باشند.

سلامی مجدد
ممنون استاد علی

شما بمن بگید بر چه اساسی Win32_ShadowCopy و Create رو انتخاب کردید تا خودتون متوجه بشید که اشکال اصلی در چیه. کار با WMI رو یادبگیرید بد نیست، خیلی هم مفیده، برای مواردی مثل دریافت اطلاعات سخت افزاری و نرم افزاری سیستم مثل پارتیشن ها و شماره سریال درایو و ... هم بدردتون خواهد خورد. اما یه مساله جانبیه. شما یک Wrapper آماده و تخصصی رو گذاشتید کنار، یک برنامه Command Line دار اساسی رو هم گذاشتید کنار و میخواهید کاری که Wrapper با یک عالمه سطر کد و صرف زمان انجام داده خودتون انجام بدید، اونم بدون اینکه حتی بدونید در کتابخانه اش چی به چیه.

تصوری که از شیوه جستجو تون دارم اینه که خیلی سرسری و عجولانه منابع رو یه نگاهی میندازید و می روید سراغ یه روش دیگه. ساختار و مکانیسم کار رو ول می کنید، سعی می کنید با امتحان کردن متد ها و کلاس ها یجور وادار به کارش کنید تا بفهمید چطور کار می کنه، روش آزمون و خطا. انگار یکی دو هفته است در مورد بوئینگ 777 جستجو کردید و الان نشستید رو صندلی خلبان و میخواهید باهاش پرواز کنید، نمیشه که. حجم مستندات VSS مایکروسافت یا کار و کد نویسی همون alphavss رو در نظر بگیرید. کار کوچیک و چند سطری که نیست که چند روزه سر همش کنید.
شما مدام می گردید دنبال یه روش دیگه. الان بخواهید به کسی در مورد Shadow Copy و Snapshot هاش و صفاتشون و مکانیسم کارش توضیح بدید چقدر اطلاع برای ارائه دارید؟ مادامی که به ساختار و ماهیتش تسلط نداشته باشید که نمی توانید برایش کد نویسی کنید. دارید طبق معمول با همون شیوه آزمون و خطا متد ها و کلاس ها رو امتحان می کنید تا ببینید چطور کار می کنه. همونطور که با نشستن در کابین خلبان و ور رفتن با سوئیچ ها و اهرم ها نمی توانید خلبانی کنید با این روش هم به نتیجه نمی رسید.

عاشق این جور عصبانی شدن تونم :green: (مزاح بود)
والا اساس اش اینه که هر چیز رو تست میکنم ، جواب نمیده .
با alphavss کار کردم که اون ارور رو داد و متوجه نشدم ارورش از چیه؟ منبعی هم برای ارورش پیدا نکردم . هیچ جا هم جواب ندادن .
با برنامه ی command line ، دستور create اش گزینه ای نداره که attributes رو مشخص کنه تا بتونیم بگیم بکاپ ها را در سربرگ previous version نشون بده .
هر چند من تا حالا اسم wmi هم نشنیدم و اولین باره دارم میبینم شون و نمیدونم فرق شون با بقیه ی کلاس ها چیه ، با این wmi آشنا شدم که گفتید توی ویندوز غیر سرور ساپورت نمیشه .
حالا هم واسه همین میخواستم مستقیما برم سر وقت آخرین گزینه یعنی کار با vss api در خود ویندوز .
به نسبت خودم ، جستجوی بدی نکردم و وقت صرف کردم اما بله روی یکی خیلی کمتر و روی یکی بیشتر ولی وقتی به جواب نرسیدم و پیگیر هم کردم و منابع را چک کردم و بازم جواب نگرفتم ، دیگه نمیدونم دلیلش چیه دیگه . بنابراین مجبور میشم برم سروقت یه گزینه ی دیگه .
نمیدونم چرا برنامه نویس ها روی این موضوع vss بکاپ بسیار کم کار کردن (کلا داخل و خارج منظورمه) . بیشترین منابع ، منابع vss api هست که مشکلش ارتباط سخت سی شارپ با اونه و دومش alphavss هست که بدیش اینه که هم مثال ازش نداره و هم مشکلاتش جایی مطرح شد .
خوب من یه کم منابع شو خوندم. درباره صفات و attributes هاش که کامل خوندم اما یه تیکه را متوجه نشدم . یه تیکه اش شاید بخاطر این باشه که روند vss و اسنپ شات را نمیدونم (البته روندشو مختصر خوندم) .



اون فایل Header اشاره شده در مستندات می بینید؟ در اون فایل تعریف شده، Header ها در اصل برای زبان ++C ئه دیگه. برای سایر زبان ها بازنویسی میشه. برای اینکه در #C ازش استفاده کنید یا باید از یک تعریف آماده اش حالا در یک کمپوننت یا ActiveX یا Wrapper استفاده کنید یا خودتون مشابهش رو با دقت تعریف کنید. مثل قضیه همون Struct های API ئه که باید سطر به سطر و بایت به بایت درست تعریف بشه.

یعنی مثل قضیه ی Struct های API که با سی شارپ و در اتوپلی با پلاگین استفاده میکردیم ، در اینجا حالا باید از کلاس Marshall استفاده کنیم؟
خوب اون استراکچر بود و فقط فیلد داشت که هم مقایر و اندازه ی فیلدها را میدونستیم و هم یه تابعی توی اون پلاگین اتوپلی بود که اشاره گر به اون استراکچری که ساختش را بهمون برمیگردوند . اما این اینترفیس هست . تابع و اعضای دیگه هم داره . چجوری میشه اشاره گر به یه تابع را برای سی پلاس پلاس در نظر گرفت؟ با تابع GetComInterfaceForObject Method؟
از ای طریق ها برم ، بهتر نیست؟ یعنی معمولا از روش غیر از Marshal و بصورت مستقیم ؟ (البته هنوز منابع زیر را نخوندم) :

Call a C++ function from C# and the param is a interface pointer

How to use interface pointer exported by C++ DLL in C#

call managed c++ funciton from c#

Implementing an unmanaged C++ interface callback in C#/.Net | xoofx


واقعا ممنون استاد علی :rose:
 
آخرین ویرایش:

the_king

مدیرکل انجمن
در مورد خطای alphavss هیچ نظری نمیتونم بدم، چون نه صحت یک کد متفرقه رو میشه تایید کرد و نه روال کار شما قاطعانه درسته و نه دلیل خطا مشخصه.
با برنامه ی command line ، دستور create اش گزینه ای نداره که attributes رو مشخص کنه تا بتونیم بگیم بکاپ ها را در سربرگ previous version نشون بده .

دستور یا همون سوئیچ Create رو کی به شما گفته؟ اشکال کار همونجا است. در ویندوز های سرور اون برنامه vssadmin یک سوئیچ create داره، این کاملا مشخصه. در ویندوز های غیر سرور همچین سوئیچی نیست، می توانید در Command Prompt با امتحان کردن دستور ?/ vssadmin لیست فرمان های پشتیبانی شده رو لیست شده ببینید.

هر چند من تا حالا اسم wmi هم نشنیدم و اولین باره دارم میبینم شون و نمیدونم فرق شون با بقیه ی کلاس ها چیه ، با این wmi آشنا شدم که گفتید توی ویندوز غیر سرور ساپورت نمیشه .
حالتون خوبه؟ چرا همه چی رو با هم قاطی پاتی می کنید. اولا WMI کلاس نیست، جزئی از ساختار داخلی ویندوز ئه و ثانیا ربطی هم به پشتیبانی Create در فلان کلاس نداره. از کجای اون لینک Create به این نتیجه رسیدید که در ویندوز غیر سرور WMI پشتیبانی نمیشه؟ من گفتم WMI در ویندوز غیر سرور پشتیبانی نمیشه؟ WMI از همون ابتدا در ویندوز XP و ویندوز های بعدی بوده و حتی در Windows 98 و Me هم قابل نصبه.
حالا هم واسه همین میخواستم مستقیما برم سر وقت آخرین گزینه یعنی کار با vss api در خود ویندوز .

مثل اینه که بخواهید بازی بسازید، ببینید کار با GameStudio سخته چون هنوز اصول و قواعد GameStudio رو یاد نگرفتید، Unity رو امتحان کنید، ببینید کار با اون سخت تره چون کار با Unity رو هم بلد نیستید، بعد سعی کنید با DirectX کار کنید، بعد ببینید دیگه خیلی سخت شد و اصلا ازش سر در نمیارید چون از ساختار DirectX اطلاعی ندارید، بعد برید سراغ گزینه خیلی سخت تری مثل کار مستقیم با درایور کارت گرافیکی. شما وقتی هنوز شناخت کاملی از VSS و کارکردش ندارید چطور ازش استفاده می کنید؟ خود VSS براتون ناشناخته است، تصوری هم از این ندارید که برای ارتباط مستقیم با VSS از طریق API چقدر حجم کار لازمه، می توانید از طریق API ارتباط برقرار کنید وقتی هنوز خود موضوع براتون جای ابهام داره؟

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

نمیدونم چرا برنامه نویس ها روی این موضوع vss بکاپ بسیار کم کار کردن (کلا داخل و خارج منظورمه) . بیشترین منابع ، منابع vss api هست که مشکلش ارتباط سخت سی شارپ با اونه و دومش alphavss هست که بدیش اینه که هم مثال ازش نداره و هم مشکلاتش جایی مطرح شد .
برنامه نویسان روی چه چیزش کار کنند؟ VSS یک سرویس ویندوز ئه برای نگهداری نسخه های پشتیبان. همانطور که Windows Update یک سرویس ویندوز ئه برای آپدیت کردن ویندوز. حالا برنامه نویسان چه کار مشخصی باید با WIndow Update داشته باشند؟ سرویس داره کار خودش رو برای ویندوز انجام میده، ارتباط خاصی با نیاز های برنامه نویس نداره. شما اگر بخواهید از فایل یا پوشه ای نسخه پشتیبان تهیه کنید هم نه محتاج به ShadowCopy هستید و نه مزیتی براتون ایجاد می کنه، ساختن فایل zip که ساده تره. فقط برنامه نویسانی لازم بوده از ShadowCopy استفاده کنند که داشتن نرم افزاری برای مدیریت ShadowCopy و Snapshot هایش بنویسند، مگر چقدر همچین نیازی پیش میاد و درضمن مگر چقدر سطح معلوماتشون پایین بوده که بیان در موردش سوال مطرح کنند. کسی که همچین نرم افزاری رو طراحی می کنه قبلش در مورد ShadowCopy بطور کامل معلوم داره و جای سوالی برایش پیش نمیاد.

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

the_king

مدیرکل انجمن
اون GetComInterfaceForObject هم برای ارتباط مستقیم با اینترفیسی ئه که به شیوه COM ارائه شده، وقتی شما با رابطی سر و کار دارید که COM و ActiveX نیست GetComInterfaceForObject کاربردی نداره. و چون روش ساده استفاده از ActiveX ها در #C وجود داره، به ندرت موردی پیش میاد که نیاز به استفاده GetComInterfaceForObject باشه.
 

SajjadKhati

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

دستور یا همون سوئیچ Create رو کی به شما گفته؟ اشکال کار همونجا است. در ویندوز های سرور اون برنامه vssadmin یک سوئیچ create داره، این کاملا مشخصه. در ویندوز های غیر سرور همچین سوئیچی نیست، می توانید در Command Prompt با امتحان کردن دستور ?/ vssadmin لیست فرمان های پشتیبانی شده رو لیست شده ببینید.

خیلی ممنون استاد علی . زحمت کشیدید .
آو !! اصل قضیه ، دستور create هست را نداره اصلا !

حالتون خوبه؟ چرا همه چی رو با هم قاطی پاتی می کنید. اولا WMI کلاس نیست، جزئی از ساختار داخلی ویندوز ئه و ثانیا ربطی هم به پشتیبانی Create در فلان کلاس نداره. از کجای اون لینک Create به این نتیجه رسیدید که در ویندوز غیر سرور WMI پشتیبانی نمیشه؟ من گفتم WMI در ویندوز غیر سرور پشتیبانی نمیشه؟ WMI از همون ابتدا در ویندوز XP و ویندوز های بعدی بوده و حتی در Windows 98 و Me هم قابل نصبه.

بله :green:
حالا من ، کلاسش (کلاس Win32_ShadowCopy) مد نظرم بود :

Win32_ShadowCopy class (Windows)

نه . شما نگفتید WMI در ویندوز غیر سرور پشتیبانی نمیشه . منظور منم این نبود . منظور من اون متد create بود که گفتید پشتیبانی نمیشه چون نوشته Minimum supported client : None supported :

Create method of the Win32\_ShadowCopy class



مثل اینه که بخواهید بازی بسازید، ببینید کار با GameStudio سخته چون هنوز اصول و قواعد GameStudio رو یاد نگرفتید، Unity رو امتحان کنید، ببینید کار با اون سخت تره چون کار با Unity رو هم بلد نیستید، بعد سعی کنید با DirectX کار کنید، بعد ببینید دیگه خیلی سخت شد و اصلا ازش سر در نمیارید چون از ساختار DirectX اطلاعی ندارید، بعد برید سراغ گزینه خیلی سخت تری مثل کار مستقیم با درایور کارت گرافیکی. شما وقتی هنوز شناخت کاملی از VSS و کارکردش ندارید چطور ازش استفاده می کنید؟ خود VSS براتون ناشناخته است، تصوری هم از این ندارید که برای ارتباط مستقیم با VSS از طریق API چقدر حجم کار لازمه، می توانید از طریق API ارتباط برقرار کنید وقتی هنوز خود موضوع براتون جای ابهام داره؟


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

الان شما میتونید بگید که باید کدوم منابع را بخونم تا متوجه بشم اون ارور alphavss برای چیه؟ یا کدوم منابع را بخونم تا یاد بگیرم که چجوری میشه بکاپ ام را در سربرگ previous version به نمایش بذارم؟

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

من قشنگ متوجه نشدم مطلب تون را . مخصوصا خط اول را . با مثال ، بهتر متوجه میشم .
 

SajjadKhati

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

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

برای مثلا اینترفیس ؛ مثل اینترفیس معمولی درست کنیم (مثلا همون استراکچری که در اون مثال لینک بالا درست کردید) . اما اونجا با متد Marshal.StructureToPtr برای استراکچر ، حافظه ی unmanaged تخصیص دادید و اشاره گرش را گرفتید ولی ایجا برای اینترفیس با کدوم تابع میشه حافظه ی unmanaged تخصیص داد؟
برای تابع ، مثل تابع معمولی در سی شارپ (صرف نظر از اشاره گر تابع که میتونه چند بیتی باشه) ، رفتار کنیم؟ برای اشاره گر به تابع ، یعنی دو اشاره گر به تابع مثل :


کد:
HRESULT CreateVssBackupComponents(IVssBackupComponents **ppBackup);

هم در سی شارپ کافیه از دلیگیت استفاده کنیم؟ چون دلیگیت که اشاره گر به تابع هست . تابع هم خودش اشاره گر هست دیگه . درسته؟
بعد هم نمیدونم با کدوم تابع در Marshal میشه حافظه ی unmanaged هم برای تابع ها و هم برای دلیگیت ها اختصاص داد؟
ممنون
 

the_king

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

من چرا؟ زحمت رو من نکشیدم، من نه vssadmin رو بهتون معرفی کردم و نه سوئیچ create اش رو. زحمت رو شما و اون عزیزی که vssadmin رو بهتون پیشنهاد کرده کشیدید. البته فکر نکنم بنده میدونسته شما روی چه ویندوزی کد نویسی می کنید.

الان شما میتونید بگید که باید کدوم منابع را بخونم تا متوجه بشم اون ارور alphavss برای چیه؟ یا کدوم منابع را بخونم تا یاد بگیرم که چجوری میشه بکاپ ام را در سربرگ previous version به نمایش بذارم؟
از مطالعه خود VSS و بعد AlphaVSS شروع کنید :
Overview of Processing a Backup Under VSS - Windows applications
Alphaleonis.Win32.Vss Namespace
وقتی نمی دونید VSS چطور کار می کنه چطور یهو پریدید سر کد نویسی و استفاده اش. فوری یه کلاس و متد Create پیدا می کنید که فکر می کنید باید یجور کار بندازیدش. نه معلومه انتخابتون درسته و نه مشخصه نتیجه چی میشه.
من قشنگ متوجه نشدم مطلب تون را . مخصوصا خط اول را . با مثال ، بهتر متوجه میشم .
خدا را شاکرم که مطالب قبلی رو متوجه شدید. مثال زیر رو ببینید :
کد:
        [StructLayout(LayoutKind.Sequential)]
        private struct RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
        }

        [DllImport("user32.dll")]
        private static extern int GetWindowRect(IntPtr hwnd, ref RECT lpRect);

        private void button1_Click(object sender, EventArgs e)
        {
            var r = new RECT();
            GetWindowRect(button1.Handle, ref r);
            MessageBox.Show($"({r.Left},{r.Top},{r.Right},{r.Bottom})");
        }
GetWindowRect که موقعیت ابعاد یک پنجره رو بدست میاره بر اساس RECT کار می کنه که چیزی شبیه به Rectangle ئه ولی اساسا RECT در API ویندوز تعریف شده و ما مجددا در #C مشابه struct اصلی اش که در ++C ئه تعریف می کنیم. حالا شما برای دسترسی به اون RECT در متد خارجی و در محیط مدیریت نشده و پر کردن حافظه مدیریت شده در #C نیازی به Marshal داشتید؟ نه. در کدی که نوشتم کاری با Marshal ندارم. خود DllImport اینکار رو بصورت خودکار انجام میده. قطعا برای دسترسی GetWindowRect به حافظه مدیریت شده r راهی وجود نداشته، یکسری عملیات پشت پرده انجام شده که شما در کدتون نمی بینید، ولی DllImport خودکار انجامش داده. Marshal میتونه در این موارد کمکتون کنه تا بجای RECT از IntPtr استفاده کنید و دستی حافظه بسازید و انتقال بدید و آزاد کنید و .... ولی برای موردی که خودکار انجام میشه، نیازی بهش نیست دلیلی نداره کار تون رو سخت کنید. قطعا مواردی پیدا میشه که ناچار باشید از Marshal استفاده کنید ولی این مثال رو زدم که بیینید Marshal برای کار با حافظه مدیریت شده ای مثل r نیست.
 

the_king

مدیرکل انجمن
برای مثلا اینترفیس ؛ مثل اینترفیس معمولی درست کنیم (مثلا همون استراکچری که در اون مثال لینک بالا درست کردید) . اما اونجا با متد Marshal.StructureToPtr برای استراکچر ، حافظه ی unmanaged تخصیص دادید و اشاره گرش را گرفتید ولی ایجا برای اینترفیس با کدوم تابع میشه حافظه ی unmanaged تخصیص داد؟
شما به اینترفیس حافظه نمیدید، اینترفیس تعریف ئه، حافظه نداره. یک پیاده سازی ازش ئه که حافظه داره. اون حافظه هم توسط سازنده اش ایجاد میشه، نه اینکه شما حافظه بسازید. شما یک متد سازنده کلاسی که با اون اینترفیس سازگاره رو فراخوانی می کنید که اون خودش حافظه لازم رو تخصیص میده.
برای تابع ، مثل تابع معمولی در سی شارپ (صرف نظر از اشاره گر تابع که میتونه چند بیتی باشه) ، رفتار کنیم؟ برای اشاره گر به تابع ، یعنی دو اشاره گر به تابع مثل :
کد:
HRESULT CreateVssBackupComponents(IVssBackupComponents **ppBackup);

هم در سی شارپ کافیه از دلیگیت استفاده کنیم؟ چون دلیگیت که اشاره گر به تابع هست . تابع هم خودش اشاره گر هست دیگه . درسته؟
بعد هم نمیدونم با کدوم تابع در Marshal میشه حافظه ی unmanaged هم برای تابع ها و هم برای دلیگیت ها اختصاص داد؟
ممنون
نه. همچین کار ساده ای نیست، برای همینه که از TypeLibrary ها و Component هایی که معمولا با زبان ++C کد نویسی شده استفاده می کنند. در نظر بگیرید شما قصد دارید خودتون alphavss رو از نو بنویسید. عاقلانه است؟
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
من چرا؟ زحمت رو من نکشیدم، من نه vssadmin رو بهتون معرفی کردم و نه سوئیچ create اش رو. زحمت رو شما و اون عزیزی که vssadmin رو بهتون پیشنهاد کرده کشیدید. البته فکر نکنم بنده میدونسته شما روی چه ویندوزی کد نویسی می کنید.


از مطالعه خود VSS و بعد AlphaVSS شروع کنید :
Overview of Processing a Backup Under VSS - Windows applications
Alphaleonis.Win32.Vss Namespace
وقتی نمی دونید VSS چطور کار می کنه چطور یهو پریدید سر کد نویسی و استفاده اش. فوری یه کلاس و متد Create پیدا می کنید که فکر می کنید باید یجور کار بندازیدش. نه معلومه انتخابتون درسته و نه مشخصه نتیجه چی میشه.

خدا را شاکرم که مطالب قبلی رو متوجه شدید. مثال زیر رو ببینید :
کد:
        [StructLayout(LayoutKind.Sequential)]
        private struct RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
        }

        [DllImport("user32.dll")]
        private static extern int GetWindowRect(IntPtr hwnd, ref RECT lpRect);

        private void button1_Click(object sender, EventArgs e)
        {
            var r = new RECT();
            GetWindowRect(button1.Handle, ref r);
            MessageBox.Show($"({r.Left},{r.Top},{r.Right},{r.Bottom})");
        }
GetWindowRect که موقعیت ابعاد یک پنجره رو بدست میاره بر اساس RECT کار می کنه که چیزی شبیه به Rectangle ئه ولی اساسا RECT در API ویندوز تعریف شده و ما مجددا در #C مشابه struct اصلی اش که در ++C ئه تعریف می کنیم. حالا شما برای دسترسی به اون RECT در متد خارجی و در محیط مدیریت نشده و پر کردن حافظه مدیریت شده در #C نیازی به Marshal داشتید؟ نه. در کدی که نوشتم کاری با Marshal ندارم. خود DllImport اینکار رو بصورت خودکار انجام میده. قطعا برای دسترسی GetWindowRect به حافظه مدیریت شده r راهی وجود نداشته، یکسری عملیات پشت پرده انجام شده که شما در کدتون نمی بینید، ولی DllImport خودکار انجامش داده. Marshal میتونه در این موارد کمکتون کنه تا بجای RECT از IntPtr استفاده کنید و دستی حافظه بسازید و انتقال بدید و آزاد کنید و .... ولی برای موردی که خودکار انجام میشه، نیازی بهش نیست دلیلی نداره کار تون رو سخت کنید. قطعا مواردی پیدا میشه که ناچار باشید از Marshal استفاده کنید ولی این مثال رو زدم که بیینید Marshal برای کار با حافظه مدیریت شده ای مثل r نیست.

خیلی ممنونم استاد عزیزم .
نمیدونم چرا لحن تون در این پست یه کم بالاست . شاید از کلمه ی "زحمت کشیدید" من ناراحت شدین ولی خدا میدونه منظورم کنایه یا تعارف نبود . منظورم این بود که خیلی ممنونم از وقتی که برای جواب دادن به این همه سئوالم میذارید . اگه جایی باعث رنجش تون شدم ، عذرخواهی میکنم .
خیلی مثال خوب و قشنگی بود . حالا بهتر متوجه شدم . اون پارامتر دوم تابع را بصورت ref دادید تا بصورت اشاره گر ارسال بشه دیگه . درسته؟
برای توابع نمیشه همچین کاری کرد؟ یعنی مثلا در تابع GetWindowRect ، اگه پارامتر دوم ، یه اشاره گر به تابع را میخواست ، نمیتونیم از همین روشی که شما رفتید ، مستقیما یه دلیگیت یا نام تابع را بدیم؟
البته اتریباتس StructLayout را دقیقا متوجه نشدم (که بعدا بیشتر پیگیری میکنم)
 

SU-57

Active Member
تصوری که از شیوه جستجو تون دارم اینه که خیلی سرسری و عجولانه منابع رو یه نگاهی میندازید و می روید سراغ یه روش دیگه. ساختار و مکانیسم کار رو ول می کنید، سعی می کنید با امتحان کردن متد ها و کلاس ها یجور وادار به کارش کنید تا بفهمید چطور کار می کنه، روش آزمون و خطا. انگار یکی دو هفته است در مورد بوئینگ 777 جستجو کردید و الان نشستید رو صندلی خلبان و میخواهید باهاش پرواز کنید، نمیشه که. حجم مستندات VSS مایکروسافت یا کار و کد نویسی همون alphavss رو در نظر بگیرید. کار کوچیک و چند سطری که نیست که چند روزه سر همش کنید.
سلام

استاد علی این مشکل رو من هم تو همه زمینه های کامپیوتر دارم واقعا چطوری می شه که مثلا توی برنامه نویسی سی شارپ، ما ساختار رو یاد بگیریم و از این روش آزمون و خطا نجات پیدا کنیم. مثلا من قبلا اینو به آقا سجاد گفتم که به فرض من میرم از MSDN کمک بگیرم و ببینم مثلا دستور for یا کارکرد یک عملگر به چه صورته و می بینم که وسط کار دستور this رو هم توی مثال آورده و طبیعتا کسی که هنوز توی مرحله یادگیری عملگر هاست دیدن دستور this یادگیری رو متوقف می کنه. من به آقا سجاد هم گفتم که MSDN گام به گام نیست. حالا شما منبعی رو میشناسید که گام به گام باشه که هم ما مجبور نباشیم با آزمون و خطا پیش بریم و هم به طور کامل ساختار ها رو یاد بگیریم.
من هدفم اینه که مثل شما یک برنامه نویس حرفه ای بشم حداقل در سی شارپ و SQL Server . امیدوارم که شما مثل یک برادر بزرگتر کمکمون کنید و راه و روش درست برنامه نویسی رو به ما یاد بدید. فقط به شخصه نمی دونم که یک روزی (قبل از اینکه دیر بشه) توانایی جبران محبت های شما استاد عزیز و آقا سجاد رو پیدا می کنم یا نه. گرچه می دونم این محبت های خالصانه و بدون چشمداشت با هیچ چیزی جبران شدنی نیست و شما هم اصلا نیازی ندارید ولی همیشه بهش فکر می کنم.


سجاد جان من در خط سوم وقتی myButton رو انتخاب می کنم همه myButton ها به حالت انتخاب شده در میان و رنگشون عوض می شه و یا Button ها. می خوام این حالت رو توی ویژوال استودیو غیر فعال کنم. گرچه ممکنه کاربردی باشه ولی برای من که در حال یادگیری هستم کاربردی نیست.
عکس

_____________________

کد:
 Button myButton = new Button();

کدوم جمله درسته:

myButton یک شی از کلاس Button است.
myButton یک متغیر از نوع کلاس Button است.
 
آخرین ویرایش:

SajjadKhati

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

سجاد جان من در خط سوم وقتی myButton رو انتخاب می کنم همه myButton ها به حالت انتخاب شده در میان و رنگشون عوض می شه و یا Button ها. می خوام این حالت رو توی ویژوال استودیو غیر فعال کنم. گرچه ممکنه کاربردی باشه ولی برای من که در حال یادگیری هستم کاربردی نیست.
عکس

_____________________

کد:
 Button myButton = new Button();

کدوم جمله درسته:

myButton یک شی از کلاس Button است.
myButton یک متغیر از نوع کلاس Button است.

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

درباره ی قضیه ی myButton ، به نظرم گزینه ی دوم درست تره یعنی :
"myButton یک متغیر از نوع کلاس Button است"

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

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
از مطالعه خود VSS و بعد AlphaVSS شروع کنید :
Overview of Processing a Backup Under VSS - Windows applications
Alphaleonis.Win32.Vss Namespace
وقتی نمی دونید VSS چطور کار می کنه چطور یهو پریدید سر کد نویسی و استفاده اش. فوری یه کلاس و متد Create پیدا می کنید که فکر می کنید باید یجور کار بندازیدش. نه معلومه انتخابتون درسته و نه مشخصه نتیجه چی میشه.

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

به هر حال ، یه نکته ای توجه من رو به خودش جلب کرد . شاید نکته و اشکال اصلی ، همین باشه .
اول این دو تا لینک را ببینید :

IVssBackupComponents::SetContext

IVssBackupComponents.SetContext Method (VssSnapshotContext)

اولا نوع داده ای ورودی تابع SetContext که بصورت api ویندوز هه (لینک اول) ، نوع LONG هست در صورتی که نوع رپر alphavss ، نوع VssVolumeSnapshotAttributes و یا در اورلود دیگه اش از نوع VssSnapshotContext هست .
نکته ی مهمتر اینکه در توضیح پارامتر این متد نوشته :

The context to be set. The context must be one of the supported values of VssSnapshotContext or a supported bit mask (or bitwise OR) of VssVolumeSnapshotAttributes with a valid VssSnapshotContext


یعنی اگه نوع VssVolumeSnapshotAttributes را مشخص کردیم ، باید به همراه یکی از انواع VssSnapshotContext هم باشه . معناش همینه . درسته دیگه؟
ولی توی رپر alphavss ، چون نوع اش را عدد نگرفت و نوع enum های VssVolumeSnapshotAttributes و VssSnapshotContext بصورت مجزا گرفت ، نمیشه نوع اینام VssVolumeSnapshotAttributes را با نوع اون اینام VssSnapshotContext بصورت اور (OR) انجام داد .

به نظرتون باید چی کار کنیم برای حل این مشکل or با اینام ها؟
 

the_king

مدیرکل انجمن
خیلی مثال خوب و قشنگی بود . حالا بهتر متوجه شدم . اون پارامتر دوم تابع را بصورت ref دادید تا بصورت اشاره گر ارسال بشه دیگه . درسته؟

در کدهای قبلی تون ref و out داشتید، مطلب جدیدی نیست. اینها راهنمای کامپایلر ئه که در کد های قبلی تون هم حتما داشتید.
درسته که ref ارسال بصورت اشاره گر ئه اما منظور اشاره گر بودن نیست، منظور ارجاع دو طرفه است، یعنی هم موقع ارسال مقداری به متد ارسال کنید و هم متد در بازگشت مقدار داخلش قرار بده یا تغییر داده بده. وگرنه ساختار های حافظه و آرایه ها طبعا بصورت اشاره گر هستند، اشاره گر بودن ربطی به ref بودن و نبودنش نداره. بر خلاف out که شما مقدار خاصی به متد ارسال نمی کنید و صرفا متد ئه که باید مقدار داخلش برگردونه، ref دو طرفه است. اگر ref و out هم هیچکدوم بکار نره فقط مقدار به متد ارسال می کنید و قرار نیست متد مقدار بازگشتی برگردونه یا داده ارسالی رو تغییر بده.
برای توابع نمیشه همچین کاری کرد؟ یعنی مثلا در تابع GetWindowRect ، اگه پارامتر دوم ، یه اشاره گر به تابع را میخواست ، نمیتونیم از همین روشی که شما رفتید ، مستقیما یه دلیگیت یا نام تابع را بدیم؟
البته اتریباتس StructLayout را دقیقا متوجه نشدم (که بعدا بیشتر پیگیری میکنم)
چرا، می توانید، خطای نحوی پیش نمیاد، ولی delegate محیط Managed شده بدرد محیط Unmanaged نمیخوره. تابعی که بر اساس اون delegate ئه و قراره اجرا بشه باید خودش در محیط Unmanaged باشه. یعنی delegate ای که تعریف کردید نباید برای اجرا شدن متدی بکار بره که خودتون در محیط Managed ئه #C می نویسید چون اون محیط Unmanaged نمیتونه از داخل محیط Managed متد اجرا کنه. برای همینه که از Wrapper و کمپوننت ها استفاده می کنند. StructLayout رو هم قبلا بررسی گرده بودید.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنونم .
اون سئوال پست آخر که مهمه (پست 953) را هم جواب بدین ، ممنون میشم .
چجوری میشه متوجه شد که مشتقات و فرزندان اینترفیس IVssBackupComponents در رپر alphavss چیه؟ تا ببینم میشه از فرزندانش ارث برد تا ببینم میشه اون متد SetContext را member hiding انجام داد (در پست 953 توضیح دادم) .
من توی object browser رفتم ولی ندیدم اینترفیس IVssBackupComponents ، مشتقی داشته باشه . از طرفی هم بصورت استاندارد ، نمیشه اینترفیسی ، مشتقی نداشته باشه .
کلا یه راهکاری برای اون مسئله ی پست 953 (آخرین پستم) میدین؟

درباره ی نحوه ی ارسال متد یا دلیگیت از محیط managed به unmanaged هم توضیح میدادین یا مثالی میزدین ، ممنون میشدم
ممنون
 

SajjadKhati

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

کد:
                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) و باز هم همون ارور را داد
 

the_king

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

استاد علی این مشکل رو من هم تو همه زمینه های کامپیوتر دارم واقعا چطوری می شه که مثلا توی برنامه نویسی سی شارپ، ما ساختار رو یاد بگیریم و از این روش آزمون و خطا نجات پیدا کنیم. مثلا من قبلا اینو به آقا سجاد گفتم که به فرض من میرم از MSDN کمک بگیرم و ببینم مثلا دستور for یا کارکرد یک عملگر به چه صورته و می بینم که وسط کار دستور this رو هم توی مثال آورده و طبیعتا کسی که هنوز توی مرحله یادگیری عملگر هاست دیدن دستور this یادگیری رو متوقف می کنه. من به آقا سجاد هم گفتم که MSDN گام به گام نیست. حالا شما منبعی رو میشناسید که گام به گام باشه که هم ما مجبور نباشیم با آزمون و خطا پیش بریم و هم به طور کامل ساختار ها رو یاد بگیریم.
هر زبانی قواعد و کلمات کلیدی خاص خودش رو داره، مثل تعریف متد و متغیر ها و if و for و private و ... اونا رو که یاد بگیرید ساختار خود زبان رو یاد گرفتید. اما آزمون خطا نه برای یادگیری این موارد کاربرد داره و نه برای اجزاء داخل NET Framework. و نه هر کمپوننت و کتابخانه ای که فکرش رو بکنید. آزمون و خطا اصلا در برنامه نویسی که بر پایه منطق و مستندات مشخصی ئه کاربردی نداره. شما نمی توانید کدی رو با آزمون و خطا به جواب برسونید و نتیجه بگیرید چون در شرایط فعلی روی سیستم من درست کار کرد پس درسته. آزمون و خطا رو ابدا نباید برای برنامه نویسی بکار ببرید. موردی در #C هست که آدم فضایی ها طراحی کرده باشن و برای ما مستند نباشه؟ آزمون و خطا رو برای ماهیتی بکار میبرن که قواعد و ذاتش برای بشر ناشناخته است و چاره ای جز آزمون و خطا نداره، کامپیوتر و نرم افزاری که خود آدمیزاد ساخته که ناشناخته نیست.

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

the_king

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

درباره ی قضیه ی myButton ، به نظرم گزینه ی دوم درست تره یعنی :
"myButton یک متغیر از نوع کلاس Button است"

اما از استاد علی بپرسین که دقیقا این دو جمله چه فلسفه ای داره
من فرقی بین دو تا جمله نمی بینم، اینکه تام یک گربه است با اینکه تام از نوع حیوان گربه است هر دو به یک اندازه درست هستند. Button کلاسه، گربه هم حیوانه و Button نوعی کلاس ئه و گربه نوعی حیوانه. اما اینکه بهشون اشاره نشه به معنی نادرستی که نیست. در جمله اول هم اشاره نکردن به اینکه Button نوعی از کلاس ها است نه اشتباهه و نه مفهومی رو تغییر میده.

اول این دو تا لینک را ببینید :

IVssBackupComponents::SetContext

IVssBackupComponents.SetContext Method (VssSnapshotContext)

اولا نوع داده ای ورودی تابع SetContext که بصورت api ویندوز هه (لینک اول) ، نوع LONG هست در صورتی که نوع رپر alphavss ، نوع VssVolumeSnapshotAttributes و یا در اورلود دیگه اش از نوع VssSnapshotContext هست .
در #C مثالهای متعددی نمیشه زد چون ماهیت انواع داده ای مشخصه ولی فرضا میدونید که IntPtr و کلا اشاره گر میتونه به Int32 یا Int64 تبدیل بشه یعنی در واقع یک داده عددی 32 بیتی یا 64 بیتی ئه یا فرضا enum ها بصورت پیشفرض مقادیر int هستند و می توانند uint هم باشند. در #C می توانید صریحا این مقادیر رو صریحا به انواع داده ای مشابه تبدیل کنید ولی در ++C / C حتی تبدیل صریح هم لازم نیست. LONG یا DWORD یا *void و ... عملا یک داده صحیح بدون اعشار هستند با همون طول 32 بیتی (یا 64 بیتی). اینکه نوع داده دیگری رو در پارامتر میبینید تناقض نیست، همانطور که شما بجای پارامتر struct ممکنه از IntPtr استفاده کنید چون هر دو نهایتا یک پارامتر بصورت اشاره گر هستند.

نکته ی مهمتر اینکه در توضیح پارامتر این متد نوشته :

The context to be set. The context must be one of the supported values of VssSnapshotContext or a supported bit mask (or bitwise OR) of VssVolumeSnapshotAttributes with a valid VssSnapshotContext
یعنی اگه نوع VssVolumeSnapshotAttributes را مشخص کردیم ، باید به همراه یکی از انواع VssSnapshotContext هم باشه . معناش همینه . درسته دیگه؟
بله، اصولا Bit Mask و صفات بیتی رو طوری در محدوده بیت ها تعریف می کنند که روی محدوده بیت های اون Context قرار نگیره و مشکلی ایجاد نشه.

ولی توی رپر alphavss ، چون نوع اش را عدد نگرفت و نوع enum های VssVolumeSnapshotAttributes و VssSnapshotContext بصورت مجزا گرفت ، نمیشه نوع اینام VssVolumeSnapshotAttributes را با نوع اون اینام VssSnapshotContext بصورت اور (OR) انجام داد .

به نظرتون باید چی کار کنیم برای حل این مشکل or با اینام ها؟
اولا جدا گرفتنش الزاما به این معنی نیست که موقع فراخوانی SetContext ترکیبشون نمی کنه. ثانیا اگر مقداری فرضا از نوع enum ئه AA باشه و بخواهید مقدار عددی 123 رو که در اون AA اصلا تعریف نشده واردش کنید می توانید به سادگی با 123(AA) اون 123 رو به نوع AA تبدیل کنید. همانطور که با اضافه کردن (int) ذر ابتدا، مقداری از فیلد های نوع AA رو به مقداری از نوع int تبدیل می کنید.
 

the_king

مدیرکل انجمن
خیلی ممنونم .
اون سئوال پست آخر که مهمه (پست 953) را هم جواب بدین ، ممنون میشم .
چجوری میشه متوجه شد که مشتقات و فرزندان اینترفیس IVssBackupComponents در رپر alphavss چیه؟ تا ببینم میشه از فرزندانش ارث برد تا ببینم میشه اون متد SetContext را member hiding انجام داد (در پست 953 توضیح دادم) .
من توی object browser رفتم ولی ندیدم اینترفیس IVssBackupComponents ، مشتقی داشته باشه . از طرفی هم بصورت استاندارد ، نمیشه اینترفیسی ، مشتقی نداشته باشه .

بجای Object Browser نرم افزار بهتری مثل ILSpy رو امتحان کنید که Derived Types هر موردی رو با بررسی خیلی دقیق و کاملی نشون میده.
درباره ی نحوه ی ارسال متد یا دلیگیت از محیط managed به unmanaged هم توضیح میدادین یا مثالی میزدین ، ممنون میشدم
ممنون
کار خاصی نیست ولی عرض کردم که. محیط 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);
        }
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
اولا جدا گرفتنش الزاما به این معنی نیست که موقع فراخوانی SetContext ترکیبشون نمی کنه. ثانیا اگر مقداری فرضا از نوع enum ئه AA باشه و بخواهید مقدار عددی 123 رو که در اون AA اصلا تعریف نشده واردش کنید می توانید به سادگی با 123(AA) اون 123 رو به نوع AA تبدیل کنید. همانطور که با اضافه کردن (int) ذر ابتدا، مقداری از فیلد های نوع AA رو به مقداری از نوع int تبدیل می کنید.

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

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

نمیدونین حالا چه راهکاری میشه برای حل مشکل این متد SetContext در alphavss گرفت؟
 

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

بالا