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 هم کردم ، جواب نداد .