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

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
شما خودتون در Main با کدی که هست فرمی رو نمایش میدهید، اگه کدی نباشه که نخ دیگه کاری برای انجام نداره و برنامه بسته میشه. یعنی بسته شدن برنامه کاری نیست که کد لازم داشته باشه. در فرم ها هم که نوشتم، با Application.Exit بسته میشه. مشکل کد شما اینه که به ظاهر اصلا برایش دسترسی ادمین نیاز نیست. اینجا یکبار و چند بار معنی نداره. چرا فکر می کنید کدتون باید یکبار اجرا بشه؟ ممکنه همون یکبار هم اضافی باشه. کد شما که اصلا کاری با دسترسی ادمین بودنش نداره، چک نمی کنه که دسترسی داره یا نه. اگر کاربر خودش برنامه رو شما رو با دسترسی ادمین اجرا کرد چه مرضی داریم که مجددا یکبار اجراش کنیم؟
حالا این به کنار، شما می توانید موقع اجرا کردن پروسه در همون ProcessStartInfo یک Arguments دلخواهی فرضا "admin" مشخص کنید که موقع اجرا شدن برنامه در Environment.GetCommandLineArgs و Environment.CommandLine قابل دسترسی ئه. اولین پارامتر اسم فایل اجرایی برنامه است و آرگومان در ادامه اش قرار میگیره. در Main می توانید اون آرگومان رو جستجو کنید تا اگر پیدا نشد، متوجه شوید که فراخوان برنامه خودتون نیست و نیازه فراخوانیش کنید. گرچه کد اشتباه با هر استدلالی اشتباهه.

ممنون استاد علی
آها یه همچین چیزی میخواستم .
پس در Process.Start ، در دومین ورودی اش (یعنی ورودی ای بنام argument ، یه آرگومان دلخواه بدم) و بعد در تابع main میتونم با Environment.GetCommandLineArgs ، اونو چک کنم که همون هست یا نه .
شما فقط بخاطر این میگین اصولی نیست که مثلا کاربر در uac اجازه ی دسترسی ادمین را نده؟ چون دسترسی ادمین برنامه از طریق کدنویسی (همین کد) را در انجمن مایکروسافت داده بودن


فرض کنید که می خواهید با برنامه تان فایل rar بسازید یا از حالت فشرده خارج کنید. دو تا گزینه دارید، یا از کمپوننت و کتابخانه های موجود استفاده می کنید و یا با دستورات command line با rar.exe کار می کنید. طبعا هم موقع کار با command line یکسری محدودیت ها پیدا می کنید، چون در کمپوننت ها مراحل اجرا تکه تکه بود و می توانستید کارهای زیادی رو انجام بدید و روی روال اجرا هم تسلط داشتید، اما در Command Line همون اول یک دستوری می دهید و تا دستور تموم نشده نه می توانید تغییری در روال بدهید و نه از پیشرفت کار با خبر می شوید. در مورد بعضی Command Line ها می توانید از ProcessStartInfo.RedirectStandardOutput کمک بگیرید تا اگر اون فرمان خروجی متنی مناسب پردازشی داره داخل برنامه تون دریافتش کنید، اما در مورد خیلی از Command Line ها حتی اینکار هم نتیجه مناسبی نداره. حالا در مورد VSS هم همین قضیه است. شما همیشه می توانید با Process.Start یک فرمان Command Line رو به یک فایل اجرایی بدهید اما تسلطی که در حین انجام کار دارید ممکنه خیلی کم باشه. اگر می خواهید در مورد کار با Command Line آشنا بشید، اول با یک نمونه ساده تر مثل C:\Windows\System32\PING.EXE تمرین کنید که سوئیچ های پیچیده و مشکل سازی نداره و سریع هم به جواب میرسه و سیستمی هم نیست که رویش کار نکنه. اگر بخواهید از اول با یک برنامه و سرویس های پیچیده تمرین کنید مشکلات تون چند برابر میشه.

آها یعنی یه فایلی هست بنام vssadmin.exe و دستورات مختلفی میگیره (مثل PING.EXE که گفتید یا cmd.exe) که اون دستوراتی که توی اون سایت دادم را باید با Process.Start ، این فایل را اجرا کنیم و در دومین ورودی اش (یعنی ورودی ای بنام argument) ، اون دستورات را بدم؟
خوب یعنی اون دستورات را نمیشه در alphavss wrapper داد؟ یعنی یک تابعی ، چیزی نیست که اون دستورات را ساپورت کنه که از اون دستورات در alphavss استفاده کرد؟
یا توی vss api خود ویندوز ( منظورم بدون استفاده از رپر و alphavss هست . یعنی توابع نوشته شده در ویندوز با ++C) ، یه تابعی یا عضوی نیست که این دستورات را ساپورت کنه؟

بعد اینکه این vssadmin.exe را از کدوم سایت میشه دانلود کرد؟ من چرخیدم ، ولی جایی ، لینک دانلودی نداشت .
ممنون
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلامی مجدد
آها vssadmin.exe توی درایو ویندوز هست .
حالا من جستجو کردم ، یکی در مسیر C:\Windows\System32 هست ، یکی دیگه هم در مسیر C:\Windows\WinSxS\amd64_microsoft-windows-vssadmin_31bf3856ad364e35_10.0.17763.1_none_b5433f5589cd1455

اونی که در مسیر C:\Windows\System32 هست را استفاده کنم؟
ویندوز من 64 بیتی هست .
فرقی با هم ندارن؟

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

بعد اینکه منظور پادویشی ها این بود که بجای استفاده از vss api یا alphavss ، از دستورات vssadmin.exe صرفا استفاده کنم؟
 
آخرین ویرایش:

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلامی مجدد
من این دستورات را تست کردم . هیچ کدوم شون کار نمیکنه!
نه با دستور Vssadmin create shadow ، شادو کپی میگیره و نه با دستور Vssadmin list shadows ، در درایو مورد نظر ، شادو کپی را نشون میده (در کد زیر) :

کد:
            Process.Start(@"C:\Windows\System32\vssadmin.exe", "vssadmin create shadow /for=F:");

            Process.Start(@"C:\Windows\System32\vssadmin.exe", "vssadmin list shadows /for=F:");

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

Vssadmin list shadowstorage

Vssadmin add shadowstorage

وقتی با این دستور شادو کپی میگیرم ، حتی صدای خرخر هارد که موقع نوشتن با alphavss (و همینطور پادویش شادو کپی میگیره) میاد هم ، دیگه نمیاد
 

the_king

مدیرکل انجمن
ممنون استاد علی
آها یه همچین چیزی میخواستم .
پس در Process.Start ، در دومین ورودی اش (یعنی ورودی ای بنام argument ، یه آرگومان دلخواه بدم) و بعد در تابع main میتونم با Environment.GetCommandLineArgs ، اونو چک کنم که همون هست یا نه .

بله
شما فقط بخاطر این میگین اصولی نیست که مثلا کاربر در uac اجازه ی دسترسی ادمین را نده؟ چون دسترسی ادمین برنامه از طریق کدنویسی (همین کد) را در انجمن مایکروسافت داده بودن
درخواست دسترسی ئه، نه دسترسی. مثل اینه که بگید در سایت مایکروسافت نوشته فرمان format بدید که درایو فرمت بشه ولی من برای :C اجراش کردم اما خطا داد و اجرا نشد. مایکروسافت که اطلاعات اشتباهی نداده، درخواست تون رد شده. نه شما می دانید روی سیستم کاربر چه دسترسی هایی تعریف شده و نه کسی که اون کد رو نوشته.

آها یعنی یه فایلی هست بنام vssadmin.exe و دستورات مختلفی میگیره (مثل PING.EXE که گفتید یا cmd.exe) که اون دستوراتی که توی اون سایت دادم را باید با Process.Start ، این فایل را اجرا کنیم و در دومین ورودی اش (یعنی ورودی ای بنام argument) ، اون دستورات را بدم؟

بله
خوب یعنی اون دستورات را نمیشه در alphavss wrapper داد؟ یعنی یک تابعی ، چیزی نیست که اون دستورات را ساپورت کنه که از اون دستورات در alphavss استفاده کرد؟
چرا از من می پرسید؟ من که عرض کردم تا به حال ازش استفاده نکردم. شما قرار بود مستندات اون alphavss رو مطالعه کنید و ببینید پشتیبانیش می کنه یا نه.
یا توی vss api خود ویندوز ( منظورم بدون استفاده از رپر و alphavss هست . یعنی توابع نوشته شده در ویندوز با ++C) ، یه تابعی یا عضوی نیست که این دستورات را ساپورت کنه؟
برای پاسخ به این سوال هم باید همون مستندات VSS در سایت مایکروسافت رو که لینکش رو هم دارید مطالعه کنید، نه اینکه از من بپرسید.
بعد اینکه این vssadmin.exe را از کدوم سایت میشه دانلود کرد؟ من چرخیدم ، ولی جایی ، لینک دانلودی نداشت .
ممنون
برای چی دانلودش کنید؟ جزئی از سیستم ویندوز ئه، مثل همون ping.exe از موقع نصب ویندوز داخلش هست. C:\Windows\System32\vssadmin.exe
 

the_king

مدیرکل انجمن
سلامی مجدد
من این دستورات را تست کردم . هیچ کدوم شون کار نمیکنه!
نه با دستور Vssadmin create shadow ، شادو کپی میگیره و نه با دستور Vssadmin list shadows ، در درایو مورد نظر ، شادو کپی را نشون میده (در کد زیر) :

کد:
            Process.Start(@"C:\Windows\System32\vssadmin.exe", "vssadmin create shadow /for=F:");

            Process.Start(@"C:\Windows\System32\vssadmin.exe", "vssadmin list shadows /for=F:");
اشتباهه، شما دارید اسم فایل اجرایی رو مجددا در آرگومان می دهید، آرگومان ":create shadow /for=F" میشه، نه ":vssadmin create shadow /for=F". اون vssadmin سوئیچ نیست.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
اشتباهه، شما دارید اسم فایل اجرایی رو مجددا در آرگومان می دهید، آرگومان ":create shadow /for=F" میشه، نه ":vssadmin create shadow /for=F". اون vssadmin سوئیچ نیست.

ممنون استاد علی
بدون vssadmin هم نوشتم ولی چیزی نشد . باز هم نه هارد صدایی داد و نه در درایو مربوطه در سربرگ previouse version ، بکاپ شادو ای نمایش داده نشد (البته بکاپ های پادویش نمایش داده میشه)
 

the_king

مدیرکل انجمن
ممنون استاد علی
بدون vssadmin هم نوشتم ولی چیزی نشد . باز هم نه هارد صدایی داد و نه در درایو مربوطه در سربرگ previouse version ، بکاپ شادو ای نمایش داده نشد (البته بکاپ های پادویش نمایش داده میشه)
قبل از اینکه کاری رو با برنامه #C تون انجام بدید در Command Prompt ویندوز امتحان کنید تا ببینید پیام پاسخ Command Line چیه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
قبل از اینکه کاری رو با برنامه #C تون انجام بدید در Command Prompt ویندوز امتحان کنید تا ببینید پیام پاسخ Command Line چیه.

ممنون استاد علی
بله
در powershell (admin) وقتی دستور :


کد:
vssadmin create shadow /for=F:

را زدم ، تمام شادو کپی بکاپ هایی که با استفاده از کد سی شارپ گرفتم را بصورت متنی در خروجی همین دستور در powershell داد . اما من میخوام کاری کنم که مثل پادویش در سربرگ previous version نشون بده که نمیدونم باید چی کار کرد .
بعد اینکه خروجی دستورات (مثل همین دستور) را نمیشه در سی شارپ دریافت کرد؟
 
آخرین ویرایش:

SajjadKhati

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

کد:
vssadmin list shadows /for=F:

وقتی اینو زدم ، اطلاعات زیر را داد :

1.jpg


صرفا اطلاعات بکاپ هایی که من گرفتم هم نیست . اطلاعات بکاپ پادویش هم هست . دو تا بکاپی که گرفتیم (هم من با اون کد سی شارپ و هم پادویش برای درایو F ، حداقل 2 برابر اینهاست ولی این فقط اطلاعات 8 بکاپ شادو کپی آخری را داد . چرا نمیدونم)
انگار دارم یه چیزهایی متوجه میشم . در تصویر بالا ، دو تا مونده به آخر ، اطلاعات بکاپی هه که من (با کد سی شارپ) گرفتم . اون آخری ، اطلاعات بکاپی هه که پادویش گرفت . تفاوت شون ، توی بخش type واسه من از نوع Backup هست (که توی متد SetContext مقدار VssSnapshotContext.Backup را ست کرده بودم) ولی برای پادویش از نوع client accecible writers هست . در قسمت attributes ، مقدار بکاپ های من از نوع differential , auto recovered هست (اما من توی تابع SetBackupState ، مقدار VssBackupType.Full _بکاپ کامل_ را ست کردم و مقدار auto recovered هم نداده بودم ولی نمیدونم چرا اطلاعات بکاپ تفاوتی را بجای بکاپ کامل میده) ولی واسه ی پادویش مقادیر Persistent, Client-accessible, No auto release, Differential, Auto recovered را میده .


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

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلامی مجدد
طبق attributes ای که برای بکاپ های پادویش ست شد ، من هم مقدار VssVolumeSnapshotAttributes را همونطوری ست کردم :


کد:
                vssBackup.SetContext(VssVolumeSnapshotAttributes.Persistent | VssVolumeSnapshotAttributes.ClientAccessible | VssVolumeSnapshotAttributes.NoAutoRelease | VssVolumeSnapshotAttributes.Differential | VssVolumeSnapshotAttributes.AutoRecover);
                vssBackup.SetBackupState(false, false, VssBackupType.Full, false);

ولی در تابع SetContext که به همین attributes ها مربوطه ، ارور زیر را میده :


کد:
Alphaleonis.Win32.Vss.VssUnsupportedContextException: 'The operation is not supported under the current context.'

در بعضی از این attributes ها ، در توضیحات سایت اینو نوشته :
This attribute should not be used explicitly by requesters when setting the context of a shadow copy

VssVolumeSnapshotAttributes Enumeration

گفتم شاید اینو میگه که نباید بصورت صریح این مقادیر ها را بدیم (اما نمیدونم چرا پس گذاشتن) . گفتم این نوع ها را حذف کنم که دو تا موند :


کد:
                vssBackup.SetContext(VssVolumeSnapshotAttributes.NoAutoRelease | VssVolumeSnapshotAttributes.Differential);
                vssBackup.SetBackupState(false, false, VssBackupType.Full, false);

که بازم همین ارور را داد .
حتی در خط دوم ، full بکاپ را هم به differential تغییر دادم . بازم همین ارور را داد .
نمیدونم باید چی کار کرد
 

the_king

مدیرکل انجمن
بعد اینکه استاد علی ، الان نمیشه خروجی این دستور (همین چیزهایی که توی عکس هست) را در سی شارپ (حالا به عنوان رشته و ...) دریافت کرد؟
در مورد ProcessStartInfo.RedirectStandardOutput جستجو کنید، مثال هست که چطور خروجی پروسس رو دریافت کنید، بصورت یک Stream خروجی میده که حالت متنی داره. برای مورد شما به احتمال زیاد مشکلی نداره چون برنامه های مایکروسافت اصولا خروجی شون استاندارد ئه، اما بخاطر بسپارید که در مورد همه برنامه ها الزاما خروجی به این روش جواب خوبی نمیده، مثلا در مورد rar.exe
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
ممنون
استاد علی ، شما هیچ جور نمیتونین راهنمایی ام کنین؟ (درباره ی ظاهر شدن بکاپ در سربرگ previews version )
من خیلی جستجو کردم ولی به نتیجه ای نرسیدم .
یه لینکی ، توضیحی ، چیزی (البته همونطور که گفتم ، خیلی از لینک ها را بررسی کردم)
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
استاد علی ، به نظرتون اگه مستقیما با vss api کار کنم و این attributes ها را در اونجا بدم ، درست میشه؟
ممکنه خود alphavss wrapper مشکل داشته باشه؟
چون دلیلی نداره وقتی پادویش این attributes ها را داره و هم توی راهنماش نوشته که میشه از عملگر or توی این attributes ها استفاده کنیم ، اما وقتی از این عملگر یا بقیه ی مقدار دیگه ی این attributes استفاده میکنیم ، ارور بده!!
 

SajjadKhati

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

Win32_ShadowCopy class (Windows)

این متد Create را فراخونی کنم :

Create method of the Win32\_ShadowCopy class

کد را هم این جوری نوشتم :


کد:
    public partial class Form1 : Form
    {
        [DllImportAttribute(@"C:\Windows\SysWOW64\wbem\vsswmi.dll",EntryPoint = "Create", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)]
        public static extern uint Create(string Volume, string Context , out string ShadowID);

        private void button4_Click(object sender, EventArgs e)
        {
            string a;
            Form1.Create("I:\\", "ClientAccessible", out a);


        }
    }

ولی ارور زیر را میده :


کد:
System.BadImageFormatException: 'An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)'

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

مسیر زیر را هم که میدم (توی اتریباتس DllImport) :
@"C:\Windows\System32\wbem\vsswmi.dll"
ارور زیر را میده :

کد:
System.EntryPointNotFoundException: 'Unable to find an entry point named 'Create' in DLL 'C:\Windows\System32\wbem\vsswmi.dll'.'

و بعد در EntryPoint این مقدار را میدم هم همین ارور را میده :

کد:
[DllImportAttribute(@"C:\Windows\System32\wbem\vsswmi.dll", EntryPoint = "Root.CIMV2.Win32_ShadowCopy.Create", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)]
        public static extern uint Create(string Volume, string Context , out string ShadowID);

این مقدار را در EntryPoint دادم چون در قسمت آخر در همون کلاس ، فضای نام مشخص کرد
ممنون
 
آخرین ویرایش:

the_king

مدیرکل انجمن
سلام
استاد علی ، به نظرتون اگه مستقیما با vss api کار کنم و این attributes ها را در اونجا بدم ، درست میشه؟
هیچ مبنایی برای پیش بینی وجود نداره، چون نمی دانید دلیل مشکل چیه.

ممکنه خود alphavss wrapper مشکل داشته باشه؟
همیشه این احتمال وجود داره، اما مادامی که تسلطی روی مساله نداشته باشید و خودتون برای اولین بار دارید همچین موردی رو امتحان می کنید نمیشه قضاوت کرد.
چون دلیلی نداره وقتی پادویش این attributes ها را داره و هم توی راهنماش نوشته که میشه از عملگر or توی این attributes ها استفاده کنیم ، اما وقتی از این عملگر یا بقیه ی مقدار دیگه ی این attributes استفاده میکنیم ، ارور بده!!
اولین مساله اینه که درک درستی از کارکرد Attribute ها داشته باشید، یعنی بدانید که چه موردی برای چه منظوری است، چه تاثیری داره، با چه Attribute ای سازگاره و در چه حالتی قابل استفاده است.
دومین مساله اینه که هیچ خطایی بدون دلیل نیست و تا زمانی که دلیلش رو پیدا نکنید هیچ نتیجه گیری مشخصی نمی توانید بکنید. مثلا شما می توانید با یک دستور ساده del فایل ها رو پاک کنید، اما نمی توانید این رو مبنا قرار بدید که همیشه فایل پاک میشه و اگر پاک نشد پس del ایراد داره. به انواع دلایل مختلف در شرایط های متفاوتی فایلهایی هستند که حذف شدنی نیستند. مادامی که اون شرایط و دلایل رو ندانید، نمی توانید نتیجه بگیرید که این del ئه که اشکال داره

اینکه از کتابخانه های داخل SysWOW64 استفاده می کنید باید به این معنا باشه که حتما یک برنامه 32 بیتی با آدرس های حافظه 32 بیتی فراخوانیشون می کنه، اگر از محیط 64 بیتی فراخوانیشون کنید که کلا کار ایراد داره.
و همانطور که قبلا هم بارها عرض کردم همینطوری و بدون مطالعه مستندات نمیشه از کتابخانه ها استفاده کرد. فرضا باید مطمئن شوید که کتابخانه مورد نظر اون متد مورد نظر رو داره، کتابخانه های زیادی در ویندوز ها مشترک هستند، اما الزاما همه شون همه متد ها رو ندارند. وقتی دارید در مورد متد Create در Win32_ShadowCopy کد می نویسید قبلش در راهنما ببینید Requirements اش چیه، وقتی نوشته Minimum supported client : None supported معنی اش اینه که در ویندوز های غیر سرور پشتیبانی نمیشه و همچین متدی رو ندارند.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
هیچ مبنایی برای پیش بینی وجود نداره، چون نمی دانید دلیل مشکل چیه.


همیشه این احتمال وجود داره، اما مادامی که تسلطی روی مساله نداشته باشید و خودتون برای اولین بار دارید همچین موردی رو امتحان می کنید نمیشه قضاوت کرد.

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

اینکه از کتابخانه های داخل SysWOW64 استفاده می کنید باید به این معنا باشه که حتما یک برنامه 32 بیتی با آدرس های حافظه 32 بیتی فراخوانیشون می کنه، اگر از محیط 64 بیتی فراخوانیشون کنید که کلا کار ایراد داره.
و همانطور که قبلا هم بارها عرض کردم همینطوری و بدون مطالعه مستندات نمیشه از کتابخانه ها استفاده کرد. فرضا باید مطمئن شوید که کتابخانه مورد نظر اون متد مورد نظر رو داره، کتابخانه های زیادی در ویندوز ها مشترک هستند، اما الزاما همه شون همه متد ها رو ندارند. وقتی دارید در مورد متد Create در Win32_ShadowCopy کد می نویسید قبلش در راهنما ببینید Requirements اش چیه، وقتی نوشته Minimum supported client : None supported معنی اش اینه که در ویندوز های غیر سرور پشتیبانی نمیشه و همچین متدی رو ندارند.

ممنون استاد علی
الان وقتی نوشته Minimum supported client : None supported ، یعنی در ویندوزهای غیر سرور (مثل ویندوز 10) ساپورت نمیشه؟!
من گفتم احتمالا مشکل از اینه که کلاس Win32_ShadowCopy بصورت wmi class هست و درباره ی روش های استفاده و شی ساختن از این نوع کلاس ها در سی شارپ داشتم میگشتم :

Retrieving a WMI Instance - Windows applications

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

SajjadKhati

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

CreateVssBackupComponents function

که بصورت :


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

هست ، چجوری میشه ازش در سی شارپ استفاده یا فراخونی کرد؟
الان ورودی اش ، دوبل اشاره گر به اینترفیس IVssBackupComponents لازم داره . حالا چجوری از این اینترفیس شی بسازیم که به عنوان ورودی اش بدیم؟
خروجی اش HRESULT هه (که احتمالا همون نوع long در سی پلاس پلاس و 64 بیتی باید باشه) اما از طرفی میگه باز خروجی اش ، شی ای به اینترفیس IVssBackupComponents هم هست . چجوری میشه؟
بعد نمیدونم چجوری با خروجی این تابع (شی اینترفیس IVssBackupComponents) ، میشه اعضای متدشونو مثل متد IVssBackupComponents::SetContext را در سی شارپ فراخونی کرد؟ :

IVssBackupComponents::SetContext

ممنون
 

SU-57

Active Member
سلام مجدد به استاد علی و آقا سجاد

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

مثلا وقتی ما می تونیم یک کنترل رو از Toolbox با کشیدن وارد فرم کنیم و خاصیت هاش رو تنظیم کنیم چه نیازی هست که تو محیط کد، دستی اینکار رو انجام بدیم؟

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

کد:
Button myButton = new Button();

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


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

the_king

مدیرکل انجمن
ممنون استاد علی
الان وقتی نوشته Minimum supported client : None supported ، یعنی در ویندوزهای غیر سرور (مثل ویندوز 10) ساپورت نمیشه؟!

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

من گفتم احتمالا مشکل از اینه که کلاس Win32_ShadowCopy بصورت wmi class هست و درباره ی روش های استفاده و شی ساختن از این نوع کلاس ها در سی شارپ داشتم میگشتم :

Retrieving a WMI Instance - Windows applications

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

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

the_king

مدیرکل انجمن
سلامی مجدد
استاد علی ، تابع CreateVssBackupComponents :

CreateVssBackupComponents function

که بصورت :


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

هست ، چجوری میشه ازش در سی شارپ استفاده یا فراخونی کرد؟
الان ورودی اش ، دوبل اشاره گر به اینترفیس IVssBackupComponents لازم داره . حالا چجوری از این اینترفیس شی بسازیم که به عنوان ورودی اش بدیم؟
خروجی اش HRESULT هه (که احتمالا همون نوع long در سی پلاس پلاس و 64 بیتی باید باشه) اما از طرفی میگه باز خروجی اش ، شی ای به اینترفیس IVssBackupComponents هم هست . چجوری میشه؟
بعد نمیدونم چجوری با خروجی این تابع (شی اینترفیس IVssBackupComponents) ، میشه اعضای متدشونو مثل متد IVssBackupComponents::SetContext را در سی شارپ فراخونی کرد؟ :

IVssBackupComponents::SetContext

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

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

بالا