SajjadKhati
کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنون استاد .
تم گرافیکی تلریک و کلا کمپوننت های تلریک را بکار بردم ولی توی فرم اصلی بکار نبردم . فرم اصلی رو هم که فقط باز میکنم (بدون باز کردن فرم تنظیمات) حدود 35 مگ رم رو اشغال میکنه . توی اون فرم ، فقط چند کنترل ساده و کوچیک transparentcontrol هه .
استاد ، کد زیر رو که اجرا میکنم :
	
	
	
		
متد GetVolumeNameForVolumeMountPointW (که درون متد GetVolumeGUID هست) وقتی میخواد اجرا بشه ، ارور زیر رو میده :
	
	
	
		
ارور را میبره روی خط Application.Run (در متد Main) در کلاس Program .
واسه ی چی هه و چجوری باید رفع اش کرد؟
بجای StringBuilder در پارامتر دوم GetVolumeNameForVolumeMountPointW ، از string هم استفاده کردم اما همین ارور رو میده . باید از کلاس Marshal براش حافظه بگیرم تا جواب بده؟
ref هم کردم ، جواب نداد .
			
			تم گرافیکی تلریک و کلا کمپوننت های تلریک را بکار بردم ولی توی فرم اصلی بکار نبردم . فرم اصلی رو هم که فقط باز میکنم (بدون باز کردن فرم تنظیمات) حدود 35 مگ رم رو اشغال میکنه . توی اون فرم ، فقط چند کنترل ساده و کوچیک transparentcontrol هه .
استاد ، کد زیر رو که اجرا میکنم :
		کد:
	
	    public static class ExtentionMethod
    {
        /// <summary>
        /// توسط نام درایو ، GUID مربوط به اون درایو را برمیگردونه .
        /// </summary>
        /// <param name="lpszVolumeMountPoint">
        /// نام درایو ای که GUID آنرا میخوایم . این نام ، باید با بک اسلش خاتمه پیدا کنه .
        /// </param>
        /// <param name="lpszVolumeName">
        /// مقدار GUID مربوط به درایوی را که در پارامتر lpszVolumeMountPoint مشخص کرده بودیم را بصورت خروجی به ما برمیگردونه .
        /// دقت کنید که این پارامتر ، خروجی هست .
        /// </param>
        /// <param name="cchBufferLength">
        /// طول بافر خروجی ، یعنی طول پارامتر رشته ی lpszVolumeName بر حسب TCHAR .
        /// اگر انکودینگ رشته ، بصورت ansi برای پارامتر lpszVolumeMountPoint در نظر گرفته بشه ، اندازه ی TCHAR برای هر کاراکتر ، یک بایت میشه وگرنه اگه unicode باشه ، اندازه ی هر کاراکتر براش 2 بایت در نظر گرفته میشه .
        /// اما با وجود طولانی ترین کاراکتر ، حداکثر 50 کاراکتر برای این پارامتر (یعنی 50 کاراکتر برای پارامتر دوم) کافی هست .
        /// </param>
        /// <returns>
        /// اگر متد ، موفقیت آمیز اجرا بشه ، مقدار بازگشتی ، غیر از صفر (یعنی true) وگرنه مقدار صفر (یعنی false) برگردونده میشه.
        /// </returns>
        [DllImport("Kernel32.dll", EntryPoint = "GetVolumeNameForVolumeMountPointW", CharSet = CharSet.Auto)]
        private static extern bool GetVolumeNameForVolumeMountPointW(string lpszVolumeMountPoint, out StringBuilder lpszVolumeName, int cchBufferLength);
        public static string GetVolumeGUID(this DriveInfo driveInfo)
        {
            StringBuilder lpszVolumeName = new StringBuilder(50);
            bool isSuccessCalling = ExtentionMethod.GetVolumeNameForVolumeMountPointW(driveInfo.Name, out lpszVolumeName, 50);
            MessageBox.Show(isSuccessCalling.ToString(), "GetVolumeGUID");
            return lpszVolumeName.ToString();
        }
    }
	متد GetVolumeNameForVolumeMountPointW (که درون متد GetVolumeGUID هست) وقتی میخواد اجرا بشه ، ارور زیر رو میده :
		کد:
	
	System.AccessViolationException: 'Attempted to read or write protected memory. This is often an indication that other memory is corrupt.'
	ارور را میبره روی خط Application.Run (در متد Main) در کلاس Program .
واسه ی چی هه و چجوری باید رفع اش کرد؟
بجای StringBuilder در پارامتر دوم GetVolumeNameForVolumeMountPointW ، از string هم استفاده کردم اما همین ارور رو میده . باید از کلاس Marshal براش حافظه بگیرم تا جواب بده؟
ref هم کردم ، جواب نداد .
				
 من کلا توی فیلم آموزشی ام ، شوخی میکنم ، آدم بخندن ، بهتر یاد میگیرن . شاداب تر میشن 








